[yast-commit] r43216 - /trunk/gtk/src/
![](https://seccdn.libravatar.org/avatar/660f918b95fb16b6bf617ac05c9637e3.jpg?s=120&d=mm&r=g)
Author: rpmcruz Date: Thu Dec 20 21:44:06 2007 New Revision: 43216 URL: http://svn.opensuse.org/viewcvs/yast?rev=43216&view=rev Log: Moving unstable-libyui to main. Modified: trunk/gtk/src/Makefile.am trunk/gtk/src/Y2CCGtk.cc trunk/gtk/src/YGBarGraph.cc trunk/gtk/src/YGComboBox.cc trunk/gtk/src/YGDialog.cc trunk/gtk/src/YGDialog.h trunk/gtk/src/YGDumbTab.cc trunk/gtk/src/YGFrame.cc trunk/gtk/src/YGImage.cc trunk/gtk/src/YGIntField.cc trunk/gtk/src/YGLabel.cc trunk/gtk/src/YGLayout.cc trunk/gtk/src/YGMenuButton.cc trunk/gtk/src/YGMultiLineEdit.cc trunk/gtk/src/YGPackageSelector.cc trunk/gtk/src/YGProgressBar.cc trunk/gtk/src/YGPushButton.cc trunk/gtk/src/YGRadioButton.cc trunk/gtk/src/YGTable.cc trunk/gtk/src/YGUI.cc trunk/gtk/src/YGUI.h trunk/gtk/src/YGUtils.cc trunk/gtk/src/YGUtils.h trunk/gtk/src/YGWidget.cc trunk/gtk/src/YGWidget.h trunk/gtk/src/YGWizard.cc trunk/gtk/src/ygtkfieldentry.c trunk/gtk/src/ygtkfieldentry.h trunk/gtk/src/ygtkfindentry.c trunk/gtk/src/ygtkimage.c trunk/gtk/src/ygtkmenubutton.c trunk/gtk/src/ygtkratiobox.c trunk/gtk/src/ygtkratiobox.h trunk/gtk/src/ygtkrichtext.c trunk/gtk/src/ygtkwizard.c trunk/gtk/src/ygtkwizard.h trunk/gtk/src/ygtkzyppwrapper.cc trunk/gtk/src/ygtkzyppwrapper.h trunk/gtk/src/yzyppwrapper.cc trunk/gtk/src/yzyppwrapper.h Modified: trunk/gtk/src/Makefile.am URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/Makefile.am?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/Makefile.am (original) +++ trunk/gtk/src/Makefile.am Thu Dec 20 21:44:06 2007 @@ -25,20 +25,19 @@ YGLabel.cc \ YGPushButton.cc \ YGProgressBar.cc \ - YGTextEntry.cc \ + YGInputField.cc \ YGMultiLineEdit.cc \ YGIntField.cc \ YGRadioButton.cc \ YGImage.cc \ YGFrame.cc \ + YGSelectionModel.cc \ YGComboBox.cc \ YGTable.cc \ - YGTree.cc \ YGMenuButton.cc \ YGBarGraph.cc \ YGDumbTab.cc \ YGWizard.cc \ - YGTime.cc \ YGPackageSelector.cc \ ygtkratiobox.c \ ygtkbargraph.c \ @@ -49,6 +48,9 @@ ygtkfindentry.c \ ygdkmngloader.c \ ygtkimage.c \ + ygtkcellrenderertextpixbuf.c \ + ygtkscrolledwindow.c \ + ygtktogglebutton.c \ ygtkhtmlwrap.c \ ygtkrichtext.c \ yzyppwrapper.cc \ Modified: trunk/gtk/src/Y2CCGtk.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/Y2CCGtk.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/Y2CCGtk.cc (original) +++ trunk/gtk/src/Y2CCGtk.cc Thu Dec 20 21:44:06 2007 @@ -6,16 +6,7 @@ #include <YGUI.h> #include <YUIComponent.h> #include <ycp/y2log.h> - -#if YAST2_VERSION >= 2015006 -// New UI plugin work -# include <Y2CCUI.h> -# define NEW_UI_PLUGIN -# define Y2CCUI_INIT -#else -# define Y2CCUI Y2ComponentCreator -# define Y2CCUI_INIT Y2ComponentBroker::BUILTIN -#endif +#include <Y2CCUI.h> class YGUIComponent : public YUIComponent { @@ -38,7 +29,7 @@ class Y2CCGtk : public Y2CCUI { public: - Y2CCGtk () : Y2CCUI (Y2CCUI_INIT) { }; + Y2CCGtk() : Y2CCUI() { }; bool isServerCreator () const { return true; }; @@ -46,23 +37,17 @@ { y2milestone( "Creating %s component", name ); if (!strcmp (name, "gtk") ) { -#ifdef NEW_UI_PLUGIN Y2Component* ret = YUIComponent::uiComponent (); if (!ret || ret->name () != name) { y2debug ("UI component is %s, creating %s", ret? ret->name().c_str() : "NULL", name); ret = new YGUIComponent(); } return ret; -#else - return new YGUIComponent(); -#endif } - else - return 0; + return 0; } }; // Singleton plugin registration instance. Y2CCGtk g_y2ccgtk; - Modified: trunk/gtk/src/YGBarGraph.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGBarGraph.cc?rev=43216&r... ============================================================================== --- trunk/gtk/src/YGBarGraph.cc (original) +++ trunk/gtk/src/YGBarGraph.cc Thu Dec 20 21:44:06 2007 @@ -13,27 +13,29 @@ class YGBarGraph : public YBarGraph, public YGWidget { public: - YGBarGraph (const YWidgetOpt &opt, YGWidget *parent) - : YBarGraph (opt) + YGBarGraph (YWidget *parent) + : YBarGraph (NULL) , YGWidget (this, parent, true, YGTK_TYPE_BAR_GRAPH, NULL) - { } + {} // YBarGraph virtual void doUpdate() { ygtk_bar_graph_create_entries (YGTK_BAR_GRAPH (getWidget()), segments()); - for (int i = 0; i < segments(); i++) + for (int i = 0; i < segments(); i++) { + const YBarGraphSegment &s = segment (i); ygtk_bar_graph_setup_entry (YGTK_BAR_GRAPH (getWidget()), i, - label(i).c_str(), value(i)); + s.label().c_str(), s.value()); + } + // FIXME: new libyui colors segments ... We probably should honor that } YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createBarGraph (YWidget *parent, YWidgetOpt &opt) +YBarGraph *YGOptionalWidgetFactory::createBarGraph (YWidget *parent) { - return new YGBarGraph (opt, YGWidget::get (parent)); + return new YGBarGraph (parent); } #include "YPartitionSplitter.h" @@ -42,50 +44,37 @@ { public: YGtkBarGraph *m_barGraph; - bool m_showDelta; GtkWidget *m_scale, *m_free_spin, *m_new_spin; - string m_freeLabel, m_newPartLabel; - YGPartitionSplitter (const YWidgetOpt &opt, YGWidget *parent, - int _usedSize, int _totalFreeSize, int _newPartSize, - int _minNewPartSize, int _minFreeSize, - const YCPString &usedLabel, const YCPString &freeLabel, - const YCPString &newPartLabel, const YCPString &freeFieldLabel, - const YCPString &newPartFieldLabel) - : YPartitionSplitter (opt, _usedSize, _totalFreeSize, _newPartSize, - _minNewPartSize, _minFreeSize, usedLabel, - freeLabel, newPartLabel, freeFieldLabel, - newPartFieldLabel) + YGPartitionSplitter (YWidget *parent, int usedSize, int totalFreeSize, int newPartSize, + int minNewPartSize, int minFreeSize, const string &usedLabel, const string &freeLabel, + const string &newPartLabel, const string &freeFieldLabel, const string &newPartFieldLabel) + : YPartitionSplitter (NULL, usedSize, totalFreeSize, newPartSize, minNewPartSize, + minFreeSize, usedLabel, freeLabel, newPartLabel, freeFieldLabel, newPartFieldLabel) , YGWidget (this, parent, true, GTK_TYPE_VBOX, NULL) { /* Bar graph widget */ GtkWidget *graph = ygtk_bar_graph_new(); m_barGraph = YGTK_BAR_GRAPH (graph); ygtk_bar_graph_create_entries (m_barGraph, 3); - ygtk_bar_graph_setup_entry (m_barGraph, 0, usedLabel->value_cstr(), - usedSize()); - m_freeLabel = freeLabel->value(); - m_newPartLabel = newPartLabel->value(); - // the others are setup-ed on SetValue() + ygtk_bar_graph_setup_entry (m_barGraph, 0, usedLabel.c_str(), usedSize); /* Labels over the slider */ GtkWidget *labels_box, *free_label, *new_part_label; labels_box = gtk_hbox_new (FALSE, 0); - free_label = gtk_label_new (freeFieldLabel->value_cstr()); - new_part_label = gtk_label_new (newPartFieldLabel->value_cstr()); + free_label = gtk_label_new (freeFieldLabel.c_str()); + new_part_label = gtk_label_new (newPartFieldLabel.c_str()); gtk_box_pack_start (GTK_BOX (labels_box), free_label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (labels_box), new_part_label, FALSE, FALSE, 0); /* Slider and the spinners */ - m_showDelta = opt.countShowDelta.value(); - GtkWidget *slider_box = gtk_hbox_new (FALSE, 0); - m_scale = gtk_hscale_new_with_range (minFreeSize(), maxFreeSize(), 1); + m_scale = gtk_hscale_new_with_range ((gdouble) minFreeSize, maxFreeSize(), 1); gtk_scale_set_draw_value (GTK_SCALE (m_scale), FALSE); m_free_spin = gtk_spin_button_new_with_range - (minFreeSize(), maxFreeSize(), 1); + (minFreeSize, maxFreeSize(), 1); m_new_spin = gtk_spin_button_new_with_range - (minNewPartSize(), maxNewPartSize(), 1); + (minNewPartSize, maxNewPartSize(), 1); gtk_box_pack_start (GTK_BOX (slider_box), m_free_spin, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (slider_box), m_scale, TRUE, TRUE, 0); @@ -103,19 +92,22 @@ gtk_box_pack_start (GTK_BOX (getWidget()), labels_box, FALSE, TRUE, 2); gtk_box_pack_start (GTK_BOX (getWidget()), slider_box, FALSE, TRUE, 2); - setValue (newPartSize()); // initialization + setValue (newPartSize); // initialization gtk_widget_show_all (getWidget()); } // YPartitionSplitter + virtual int value() + { + return gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (m_new_spin)); + } + virtual void setValue (int newValue) { IMPL - YPartitionSplitter::setValue (newValue); - - ygtk_bar_graph_setup_entry (m_barGraph, 1, m_freeLabel.c_str(), - remainingFreeSize()); - ygtk_bar_graph_setup_entry (m_barGraph, 2, m_newPartLabel.c_str(), + ygtk_bar_graph_setup_entry (m_barGraph, 1, freeLabel().c_str(), + freeSize()); + ygtk_bar_graph_setup_entry (m_barGraph, 2, newPartLabel().c_str(), newPartSize()); // block connections @@ -126,11 +118,9 @@ g_signal_handlers_block_by_func (m_new_spin, (gpointer) new_spin_changed_cb, this); - gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_free_spin), - remainingFreeSize()); - gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_new_spin), - newPartSize()); - gtk_range_set_value (GTK_RANGE (m_scale), remainingFreeSize()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_free_spin), freeSize()); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_new_spin), newPartSize()); + gtk_range_set_value (GTK_RANGE (m_scale), freeSize()); // unblock connections g_signal_handlers_unblock_by_func (m_scale, @@ -146,8 +136,6 @@ IMPL int newFreeSize = (int) gtk_range_get_value (range); int newPartSize = pThis->totalFreeSize() - newFreeSize; - if (pThis->m_showDelta) - newPartSize += pThis->usedSize(); pThis->setValue (newPartSize); pThis->emitEvent (YEvent::ValueChanged); @@ -158,8 +146,6 @@ IMPL int newFreeSize = gtk_spin_button_get_value_as_int (spin); int newPartSize = pThis->totalFreeSize() - newFreeSize; - if (pThis->m_showDelta) - newPartSize += pThis->usedSize(); pThis->setValue (newPartSize); pThis->emitEvent (YEvent::ValueChanged); @@ -168,26 +154,21 @@ static void new_spin_changed_cb (GtkSpinButton *spin, YGPartitionSplitter *pThis) { IMPL - if (pThis->m_showDelta) - pThis->setValue (pThis->remainingFreeSize() - pThis->totalFreeSize()); - else - pThis->setValue (gtk_spin_button_get_value_as_int (spin)); + pThis->setValue (gtk_spin_button_get_value_as_int (spin)); pThis->emitEvent (YEvent::ValueChanged); } YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createPartitionSplitter (YWidget *parent, YWidgetOpt &opt, - int usedSize, int totalFreeSize, int newPartSize, - int minNewPartSize, int minFreeSize, - const YCPString &usedLabel,const YCPString &freeLabel, - const YCPString &newPartLabel, - const YCPString &freeFieldLabel, - const YCPString &newPartFieldLabel) +YPartitionSplitter *YGOptionalWidgetFactory::createPartitionSplitter (YWidget *parent, + int usedSize, int totalFreeSize, int newPartSize, int minNewPartSize, + int minFreeSize, const string &usedLabel, const string &freeLabel, + const string &newPartLabel, const string &freeFieldLabel, + const string &newPartFieldLabel) { - return new YGPartitionSplitter (opt, YGWidget::get (parent), usedSize, - totalFreeSize, newPartSize, minNewPartSize, minFreeSize, usedLabel, - freeLabel, newPartLabel, freeFieldLabel, newPartFieldLabel); + return new YGPartitionSplitter (parent, usedSize, totalFreeSize, newPartSize, + minNewPartSize, minFreeSize, usedLabel, freeLabel, newPartLabel, freeFieldLabel, + newPartFieldLabel); } + Modified: trunk/gtk/src/YGComboBox.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGComboBox.cc?rev=43216&r... ============================================================================== --- trunk/gtk/src/YGComboBox.cc (original) +++ trunk/gtk/src/YGComboBox.cc Thu Dec 20 21:44:06 2007 @@ -7,43 +7,41 @@ #include <YGUI.h> #include "YGUtils.h" #include "YComboBox.h" +#include "YGSelectionModel.h" #include "YGWidget.h" -class YGComboBox : public YComboBox, public YGLabeledWidget +class YGComboBox : public YComboBox, public YGLabeledWidget, public YGSelectionModel { -bool m_showingIcons; - public: - YGComboBox (const YWidgetOpt &opt, YGWidget *parent, YCPString label) - : YComboBox (opt, label) + YGComboBox (YWidget *parent, const string &label, bool editable) + : YComboBox (NULL, label, editable) , YGLabeledWidget (this, parent, label, YD_HORIZ, true, - opt.isEditable.value() ? GTK_TYPE_COMBO_BOX_ENTRY : GTK_TYPE_COMBO_BOX, NULL) + editable ? GTK_TYPE_COMBO_BOX_ENTRY : GTK_TYPE_COMBO_BOX, NULL) + , YGSelectionModel (this, true, false) { - // pixbufs will be enabled if icons are provided - m_showingIcons = false; - - GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF); - gtk_combo_box_set_model (GTK_COMBO_BOX (getWidget()), GTK_TREE_MODEL (store)); - g_object_unref (store); - - if(opt.isEditable.value()) { - gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (getWidget()), 0); + gtk_combo_box_set_model (getComboBox(), getModel()); + GtkCellRenderer* cell; + if (editable) { + gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (getWidget()), + YGSelectionModel::LABEL_COLUMN); } else { - GtkCellRenderer* cell = gtk_cell_renderer_text_new (); + cell = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (getWidget()), cell, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (getWidget()), cell, - "text", 0, NULL); + "text", YGSelectionModel::LABEL_COLUMN, NULL); } + cell = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (getWidget()), cell, FALSE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (getWidget()), cell, + "pixbuf", YGSelectionModel::ICON_COLUMN, NULL); g_signal_connect (G_OBJECT (getWidget()), "changed", G_CALLBACK (selected_changed_cb), this); } - GtkComboBox *getComboBox() const - { - return GTK_COMBO_BOX ((const_cast<YGComboBox *>(this)->getWidget())); - } + inline GtkComboBox *getComboBox() + { return GTK_COMBO_BOX (getWidget()); } GtkEntry *getEntry() { @@ -61,67 +59,53 @@ return GTK_ENTRY (entry); } - virtual void itemAdded (const YCPString &string, int index, bool selected) + virtual string text() { - GtkListStore *store = GTK_LIST_STORE (gtk_combo_box_get_model (getComboBox())); - GtkTreeIter iter; - gtk_list_store_insert (store, &iter, index); - gtk_list_store_set (store, &iter, 0, string->value_cstr(), -1); - - if(hasIcons() && !m_showingIcons) { - GtkCellRenderer* cell = gtk_cell_renderer_pixbuf_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (getWidget()), cell, FALSE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (getWidget()), cell, - "pixbuf", 1, NULL); - m_showingIcons = true; - } - - if (hasIcons() && !itemIcon (index)->value().empty()) { - std::string path = itemIcon (index)->value(); - if (path[0] != '/') - path = ICON_DIR + path; - - GdkPixbuf *pixbuf; - GError *error = 0; - pixbuf = gdk_pixbuf_new_from_file (path.c_str(), &error); - if (!pixbuf) - y2warning ("YGComboBox: Could not load icon: %s.\n" - "Because %s", path.c_str(), error->message); - gtk_list_store_set (store, &iter, 1, pixbuf, -1); - } - - if (selected || index == 0) - setCurrentItem (index); + return gtk_combo_box_get_active_text (getComboBox()); } - virtual void setValue (const YCPString &value) + virtual void setText (const string &value) { IMPL - gtk_entry_set_text (getEntry(), value->value_cstr()); + gtk_entry_set_text (getEntry(), value.c_str()); } - virtual YCPString getValue() const + // YGSelectionModel + virtual void setFocusItem (GtkTreeIter *iter, bool addingRow) { - return YCPString (gtk_combo_box_get_active_text (getComboBox())); + // GtkComboBox wants a string on the model, not NULL, when setting it as + // the active row. As, we only set that value after addingRow, we need to + // initialize it here... + if (addingRow) + setCellLabel (iter, YGSelectionModel::LABEL_COLUMN, string()); + gtk_combo_box_set_active_iter (getComboBox(), iter); } - virtual int getCurrentItem() const + virtual void unsetFocus() { - return gtk_combo_box_get_active (getComboBox()); + gtk_combo_box_set_active (getComboBox(), -1); } - virtual void setCurrentItem (int index) - { - g_signal_handlers_block_by_func (getWidget(), (gpointer) selected_changed_cb, this); - gtk_combo_box_set_active (GTK_COMBO_BOX(getWidget()), index); - g_signal_handlers_unblock_by_func (getWidget(), (gpointer) selected_changed_cb, this); - } + virtual YItem *focusItem() + { + GtkTreeIter iter; + if (gtk_combo_box_get_active_iter (getComboBox(), &iter)) + return getItem (&iter); + return NULL; + } + // YComboBox virtual void setInputMaxLength (const YCPInteger &numberOfChars) { gtk_entry_set_width_chars (getEntry(), numberOfChars->asInteger()->value()); } + virtual void setValidChars (const string &validChars) + { + YGUtils::setFilter (getEntry(), validChars); + YComboBox::setValidChars (validChars); + } + // Events notifications static void selected_changed_cb (GtkComboBox *widget, YGComboBox *pThis) { @@ -129,29 +113,20 @@ typed some text on a writable ComboBox. text_changed is true for the later and false for the former. */ bool text_changed = GTK_IS_COMBO_BOX_ENTRY (widget) - && pThis->getCurrentItem() == -1; - - if (text_changed) { - g_signal_handlers_block_by_func (pThis->getWidget(), (gpointer) - selected_changed_cb, pThis); - YGUtils::filterText (GTK_EDITABLE (pThis->getEntry()), 0, -1, - pThis->getValidChars()->value_cstr()); - g_signal_handlers_unblock_by_func (pThis->getWidget(), (gpointer) - selected_changed_cb, pThis); - + && pThis->selectedItem() == NULL; + if (text_changed) pThis->emitEvent (YEvent::ValueChanged, true, true); - } else pThis->emitEvent (YEvent::SelectionChanged, true, true); } YGWIDGET_IMPL_COMMON - YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN(YComboBox) + YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YComboBox) + YGSELECTION_WIDGET_IMPL_ALL (YComboBox) }; -YWidget * -YGUI::createComboBox (YWidget *parent, YWidgetOpt & opt, - const YCPString & label) +YComboBox *YGWidgetFactory::createComboBox (YWidget *parent, const string &label, bool editable) { - return new YGComboBox (opt, YGWidget::get (parent), label); + return new YGComboBox (parent, label, editable); } + Modified: trunk/gtk/src/YGDialog.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGDialog.cc?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/YGDialog.cc (original) +++ trunk/gtk/src/YGDialog.cc Thu Dec 20 21:44:06 2007 @@ -4,14 +4,14 @@ #include <config.h> #include <ycp/y2log.h> -#include <YGUI.h> +#include "YGUI.h" #include "YGDialog.h" #include <gdk/gdkkeysyms.h> #include <math.h> // easter -/* In the main dialog case (when opt.hasDefaultSize is set), it doesn't - necessarly have a window of its own. If there is already a main window, it - should replace its content -- and when closed, the previous dialog restored. +/* In the main dialog case, it doesn't necessarly have a window of its own. If + there is already a main window, it should replace its content -- and when closed, + the previous dialog restored. Therefore, we have a YGDialog (the YDialog implementation), and a YGWindow that does the windowing work and has a YWidget has its children, which can @@ -19,248 +19,260 @@ */ class YGWindow; -static YGWindow *main_window = NULL; +static YGWindow *main_window = 0; -YGWindow::~YGWindow() +class YGWindow { - IMPL - setChild (NULL); - gtk_widget_destroy (m_widget); - g_object_unref (G_OBJECT (m_widget)); -} + GtkWidget *m_widget; + int m_refcount; + // we keep a pointer of the child just for debugging + // (ie. dump yast tree) + YWidget *m_child; -void YGWindow::setChild (YWidget *new_child) -{ - IMPL - GtkWidget *child = gtk_bin_get_child (GTK_BIN (m_widget)); - if (child) - gtk_container_remove (GTK_CONTAINER (m_widget), child); - if (new_child) { - child = YGWidget::get (new_child)->getLayout(); - gtk_container_add (GTK_CONTAINER (m_widget), child); - } - m_child = new_child; -} +public: + YGWindowCloseFn m_canClose; + void *m_canCloseData; -void YGWindow::ref (YGWindow *window) -{ - window->m_refcount++; -} -void YGWindow::unref (YGWindow *window) -{ - if (--window->m_refcount == 0) { - bool is_main_window = (window == main_window); - delete window; - if (is_main_window) - main_window = NULL; - } -} + YGWindow (bool _main_window) + { + m_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_object_ref (G_OBJECT (m_widget)); + gtk_object_sink (GTK_OBJECT (m_widget)); + + m_refcount = 0; + m_child = NULL; + m_canClose = NULL; + + { + GtkWindow *parent = NULL; + if (main_window) + parent = GTK_WINDOW (main_window->getWidget()); + GtkWindow *window = GTK_WINDOW (m_widget); + + if (parent) { + // if there is a parent, this would be a dialog + gtk_window_set_title (window, ""); + gtk_window_set_modal (window, TRUE); + gtk_window_set_transient_for (window, parent); + gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); + //gtk_window_set_focus_on_map (window, FALSE); + } + else { + gtk_window_set_title (window, "YaST"); + if (YGUI::ui()->unsetBorder()) + gtk_window_set_decorated (window, FALSE); + } + + if (_main_window) { + int w = YGUI::ui()->_getDefaultWidth(), + h = YGUI::ui()->_getDefaultHeight(); + gtk_window_set_default_size (window, w, h); + } + + if (YGUI::ui()->setFullscreen()) + gtk_window_fullscreen (window); + + gtk_window_set_role (window, "yast-gtk"); + if (!YGUI::ui()->hasWM()) + g_signal_connect (G_OBJECT (m_widget), "expose-event", + G_CALLBACK (draw_border_cb), this); + } -static gboolean draw_border_cb (GtkWidget *widget, GdkEventExpose *event, - YGWindow *pThis) -{ - IMPL - // to avoid background from overlapping, we emit the expose to the containee - // ourselves - gtk_container_propagate_expose (GTK_CONTAINER (widget), - gtk_bin_get_child (GTK_BIN (widget)), - event); - - GtkAllocation *alloc = &widget->allocation; - gtk_draw_shadow (gtk_widget_get_style (widget), widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT, - alloc->x, alloc->y, alloc->width, alloc->height); - return TRUE; -} - -static gboolean expode_window_timeout_cb (gpointer data) -{ - GtkWindow *window = YGUI::ui()->currentWindow(); - if (!window) - return FALSE; - srand (time (NULL)); - gint x, y; - gtk_window_get_position (window, &x, &y); -#if 0 - // OVAL MOVE - for (int i = 180; i < 360+180; i++) { - gtk_window_move (window, x+(int)(sin((i*G_PI)/180)*50), - y+(int)(cos((i*G_PI)/180)*50)+50); - while (gtk_events_pending()) - gtk_main_iteration(); - usleep (25); - } -#else - // EXPLOSION - for (int i = 0; i < 40; i++) { - gtk_window_move (window, x+(int)((((float)(rand())/RAND_MAX)*40)-20), - y+(int)((((float)(rand())/RAND_MAX)*40)-20)); - while (gtk_events_pending()) - gtk_main_iteration(); - usleep (200); - } -#endif - gtk_window_move (window, x, y); - return TRUE; -} + if (_main_window) + main_window = this; -gboolean YGWindow::close_window_cb (GtkWidget *widget, GdkEvent *event, - YGWindow *pThis) -{ - IMPL - // never let GTK+ destroy the window! just inform YCP, and let it - // do its thing. - pThis->closeWindow(); - return TRUE; -} + g_signal_connect (G_OBJECT (m_widget), "delete-event", + G_CALLBACK (close_window_cb), this); + g_signal_connect_after (G_OBJECT (m_widget), "key-press-event", + G_CALLBACK (key_pressed_cb), this); + } -void YGWindow::closeWindow() -{ - if (!m_canClose || m_canClose (m_canCloseData)) - YGUI::ui()->sendEvent (new YCancelEvent()); -} + ~YGWindow() + { + IMPL + setChild (NULL); + gtk_widget_destroy (m_widget); + g_object_unref (G_OBJECT (m_widget)); + } -static gboolean key_pressed_cb (GtkWidget *widget, GdkEventKey *event, - YGWindow *pThis) -{ - IMPL - // if not main dialog, close it on escape - if (event->keyval == GDK_Escape && - /* not main window */ main_window != pThis) + void setChild (YWidget *new_child) + { + IMPL + GtkWidget *child = gtk_bin_get_child (GTK_BIN (m_widget)); + if (child) + gtk_container_remove (GTK_CONTAINER (m_widget), child); + if (new_child) { + child = YGWidget::get (new_child)->getLayout(); + gtk_container_add (GTK_CONTAINER (m_widget), child); + } + m_child = new_child; + } + + static void ref (YGWindow *window) { - pThis->closeWindow(); - return TRUE; - + window->m_refcount++; } - if (event->state & GDK_SHIFT_MASK) { - switch (event->keyval) { - case GDK_F8: - YGUI::ui()->askSaveLogs(); - return TRUE; - default: - break; + static void unref (YGWindow *window) + { + if (--window->m_refcount == 0) { + bool is_main_window = (window == main_window); + delete window; + if (is_main_window) + main_window = NULL; } } - if ((event->state & GDK_CONTROL_MASK) && (event->state & GDK_SHIFT_MASK) - && (event->state & GDK_MOD1_MASK)) { - y2milestone ("Caught YaST2 magic key combination"); - switch (event->keyval) { - case GDK_S: - YGUI::ui()->makeScreenShot(""); - return TRUE; - case GDK_M: - YGUI::ui()->toggleRecordMacro(); - return TRUE; - case GDK_P: - YGUI::ui()->askPlayMacro(); - return TRUE; - case GDK_D: - YGUI::ui()->sendEvent (new YDebugEvent()); - return TRUE; - case GDK_X: - y2milestone ("Starting xterm"); - system ("/usr/bin/xterm &"); - return TRUE; - case GDK_T: - dumpYastTree (pThis->getChild()); - return TRUE; - case GDK_H: - dumpYastHtml (pThis->getChild()); - return TRUE; - case GDK_E: // easter egg - static guint explode_timeout = 0; - if (explode_timeout == 0) - explode_timeout = g_timeout_add (10000, - expode_window_timeout_cb, NULL); - else { - g_source_remove (explode_timeout); - explode_timeout = 0; - } - return TRUE; - default: - break; - } - } - return FALSE; -} -YGWindow::YGWindow (bool main_window) -{ - m_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_object_ref (G_OBJECT (m_widget)); - gtk_object_sink (GTK_OBJECT (m_widget)); - - m_refcount = 0; - if (main_window) - ::main_window = this; - m_child = NULL; - m_canClose = NULL; - - { - GtkWindow *parent = YGUI::ui()->currentWindow(); - GtkWindow *window = GTK_WINDOW (m_widget); - - if (parent) { - // if there is a parent, this would be a dialog - gtk_window_set_title (window, ""); - gtk_window_set_modal (window, TRUE); - gtk_window_set_transient_for (window, parent); - gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); - //gtk_window_set_focus_on_map (window, FALSE); - } - else { - gtk_window_set_title (window, "YaST"); - if (YGUI::ui()->unsetBorder()) - gtk_window_set_decorated (window, FALSE); - } - - if (main_window) { - int w = YGUI::ui()->getDefaultSize (YD_HORIZ), - h = YGUI::ui()->getDefaultSize (YD_VERT); - gtk_window_set_default_size (window, w, h); - } - - gtk_window_set_role (window, "yast-gtk"); - if (!YGUI::ui()->hasWM()) - g_signal_connect (G_OBJECT (m_widget), "expose-event", - G_CALLBACK (draw_border_cb), this); - } + // Y(G)Widget-like methods + GtkWidget *getWidget() { return m_widget; } + YWidget *getChild() { return m_child; } - g_signal_connect (G_OBJECT (m_widget), "delete-event", - G_CALLBACK (close_window_cb), this); - g_signal_connect_after (G_OBJECT (m_widget), "key-press-event", - G_CALLBACK (key_pressed_cb), this); -} +private: + void close() + { + if (!m_canClose || m_canClose (m_canCloseData)) + YGUI::ui()->sendEvent (new YCancelEvent()); + } -void YGWindow::setCloseCallback (YGWindowCloseFn canClose, void *canCloseData) -{ - m_canClose = canClose; - m_canCloseData = canCloseData; -} + static gboolean close_window_cb (GtkWidget *widget, GdkEvent *event, + YGWindow *pThis) + { + IMPL + // never let GTK+ destroy the window! just inform YCP, and let it + // do its thing. + pThis->close(); + return TRUE; + } -void YGWindow::unsetCloseCallback() -{ - m_canClose = NULL; -} + static gboolean key_pressed_cb (GtkWidget *widget, GdkEventKey *event, + YGWindow *pThis) + { + IMPL + // if not main dialog, close it on escape + if (event->keyval == GDK_Escape && + /* not main window */ main_window != pThis) + { + pThis->close(); + return TRUE; + + } + + if (event->state & GDK_SHIFT_MASK) { + switch (event->keyval) { + case GDK_F8: + YGUI::ui()->askSaveLogs(); + return TRUE; + default: + break; + } + } + if ((event->state & GDK_CONTROL_MASK) && (event->state & GDK_SHIFT_MASK) + && (event->state & GDK_MOD1_MASK)) { + y2milestone ("Caught YaST2 magic key combination"); + switch (event->keyval) { + case GDK_S: + YGUI::ui()->makeScreenShot(""); + return TRUE; + case GDK_M: + YGUI::ui()->toggleRecordMacro(); + return TRUE; + case GDK_P: + YGUI::ui()->askPlayMacro(); + return TRUE; + case GDK_D: + YGUI::ui()->sendEvent (new YDebugEvent()); + return TRUE; + case GDK_X: + y2milestone ("Starting xterm"); + system ("/usr/bin/xterm &"); + return TRUE; + case GDK_T: + dumpYastTree (pThis->getChild()); + return TRUE; + case GDK_H: + dumpYastHtml (pThis->getChild()); + return TRUE; + case GDK_E: // easter egg + static guint explode_timeout = 0; + if (explode_timeout == 0) + explode_timeout = g_timeout_add (10000, + expode_window_timeout_cb, pThis); + else { + g_source_remove (explode_timeout); + explode_timeout = 0; + } + return TRUE; + default: + break; + } + } + return FALSE; + } + + static gboolean draw_border_cb (GtkWidget *widget, GdkEventExpose *event, + YGWindow *pThis) + { + IMPL + // to avoid background from overlapping, we emit the expose to the containee + // ourselves + gtk_container_propagate_expose (GTK_CONTAINER (widget), + gtk_bin_get_child (GTK_BIN (widget)), + event); + + GtkAllocation *alloc = &widget->allocation; + gtk_draw_shadow (gtk_widget_get_style (widget), widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT, + alloc->x, alloc->y, alloc->width, alloc->height); + return TRUE; + } + + static gboolean expode_window_timeout_cb (gpointer data) + { + YGWindow *pThis = (YGWindow *) data; + GtkWindow *window = GTK_WINDOW (pThis->m_widget); + srand (time (NULL)); + gint x, y; + gtk_window_get_position (window, &x, &y); + #if 0 + // OVAL MOVE + for (int i = 180; i < 360+180; i++) { + gtk_window_move (window, x+(int)(sin((i*G_PI)/180)*50), + y+(int)(cos((i*G_PI)/180)*50)+50); + while (gtk_events_pending()) + gtk_main_iteration(); + usleep (25); + } + #else + // EXPLOSION + for (int i = 0; i < 40; i++) { + gtk_window_move (window, x+(int)((((float)(rand())/RAND_MAX)*40)-20), + y+(int)((((float)(rand())/RAND_MAX)*40)-20)); + while (gtk_events_pending()) + gtk_main_iteration(); + usleep (200); + } + #endif + gtk_window_move (window, x, y); + return TRUE; + } +}; -YGDialog::YGDialog (YWidgetOpt &opt) - : YDialog (opt), - YGWidget (this, NULL, FALSE, GTK_TYPE_HBOX, NULL) +YGDialog::YGDialog (YDialogType dialogType, YDialogColorMode colorMode) + : YDialog (dialogType, colorMode), + YGWidget (this, NULL, FALSE, GTK_TYPE_HBOX, NULL) { setBorder (0); - m_padding = 0; m_containee = gtk_event_box_new(); - if (hasDefaultSize() && main_window) + if (dialogType == YMainDialog && main_window) m_window = main_window; else - m_window = new YGWindow (hasDefaultSize()); + m_window = new YGWindow (dialogType == YMainDialog); YGWindow::ref (m_window); - if (hasWarnColor() || hasInfoColor()) { + if (colorMode != YDialogNormalColor) { // emulate a warning / info dialog GtkWidget *icon = gtk_image_new_from_stock - (hasWarnColor() ? GTK_STOCK_DIALOG_WARNING : GTK_STOCK_DIALOG_INFO, + (colorMode == YDialogWarnColor ? GTK_STOCK_DIALOG_WARNING : GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0); gtk_misc_set_padding (GTK_MISC (icon), 0, 12); @@ -270,7 +282,6 @@ GtkRequisition req; gtk_widget_size_request (icon, &req); - m_padding = req.width + 24; } else gtk_box_pack_start (GTK_BOX (getWidget()), m_containee, TRUE, TRUE, 0); @@ -303,31 +314,22 @@ gtk_widget_hide (m_window->getWidget()); } -YDialog * -YGUI::createDialog (YWidgetOpt &opt) -{ - IMPL - return new YGDialog (opt); -} - static list <YGDialog *> dialogs_stack; -void -YGUI::showDialog (YDialog *_dialog) +void YGUI::showDialog (YDialog *_dialog) { IMPL YGDialog *dialog = static_cast <YGDialog *> (_dialog); - if (dialog->hasDefaultSize()) + if (dialog->dialogType() == YMainDialog) dialogs_stack.push_back (dialog); dialog->showWindow(); } -void -YGUI::closeDialog (YDialog *_dialog) +void YGUI::closeDialog (YDialog *_dialog) { IMPL YGDialog *dialog = static_cast <YGDialog *> (_dialog); - if (dialog->hasDefaultSize()) { + if (dialog->dialogType() == YMainDialog) { dialogs_stack.pop_back(); if (!dialogs_stack.empty()) { YGDialog *old_dialog = dialogs_stack.back(); @@ -340,24 +342,36 @@ dialog->hideWindow(); } -GtkWindow * -YGUI::currentWindow() +YGDialog *YGDialog::currentDialog() { - YDialog *ydialog = YGUI::ui()->currentDialog(); + YDialog *ydialog = YDialog::currentDialog (false); if (ydialog) - return static_cast<YGDialog *>(ydialog)->getWindow(); - else - return NULL; + return static_cast <YGDialog *> (ydialog); + return NULL; } -YGDialog * -YGUI::currentYGDialog() +GtkWindow *YGDialog::currentWindow() { - YDialog *ydialog = YGUI::ui()->currentDialog(); + YGDialog *ydialog = YGDialog::currentDialog(); if (ydialog) - return static_cast<YGDialog *>(ydialog); - else - return NULL; + return GTK_WINDOW (ydialog->m_window->getWidget()); + return NULL; +} + +void YGDialog::setCloseCallback (YGWindowCloseFn canClose, void *canCloseData) +{ + m_window->m_canClose = canClose; + m_window->m_canCloseData = canCloseData; +} + +void YGDialog::unsetCloseCallback() +{ + m_window->m_canClose = NULL; +} + +void YGDialog::normalCursor() +{ + gdk_window_set_cursor (m_window->getWidget()->window, NULL); } void YGDialog::busyCursor() @@ -372,8 +386,9 @@ gdk_window_set_cursor (m_window->getWidget()->window, cursor); } -void YGDialog::normalCursor() +YDialog *YGWidgetFactory::createDialog (YDialogType dialogType, YDialogColorMode colorMode) { - gdk_window_set_cursor (m_window->getWidget()->window, NULL); + IMPL + return new YGDialog (dialogType, colorMode); } Modified: trunk/gtk/src/YGDialog.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGDialog.h?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGDialog.h (original) +++ trunk/gtk/src/YGDialog.h Thu Dec 20 21:44:06 2007 @@ -4,64 +4,31 @@ #include "YGWidget.h" #include "YDialog.h" +class YGWindow; typedef bool (*YGWindowCloseFn) (void *closure); -class YGWindow -{ - GtkWidget *m_widget; - int m_refcount; - // we keep a pointer of the child just for debugging - // (ie. dump yast tree) - YWidget *m_child; - YGWindowCloseFn m_canClose; - void *m_canCloseData; - -private: - static gboolean close_window_cb (GtkWidget *widget, GdkEvent *event, - YGWindow *pThis); -public: - YGWindow (bool main_window); - ~YGWindow(); - void setChild (YWidget *new_child); - static void ref (YGWindow *window); - static void unref (YGWindow *window); - - void normalCursor(); - void busyCursor(); - - void setCloseCallback (YGWindowCloseFn canClose, void *canCloseData); - void unsetCloseCallback(); - void closeWindow(); - - // Y(G)Widget-like methods - GtkWidget *getWidget() { return m_widget; } - YWidget *getChild() { return m_child; } -}; - class YGDialog : public YDialog, public YGWidget { - int m_padding; GtkWidget *m_containee; - YGWindow *m_window; public: - YGDialog (YWidgetOpt &opt); + YGDialog (YDialogType dialogType, YDialogColorMode colorMode); virtual ~YGDialog(); void showWindow(); void hideWindow(); - GtkWindow *getWindow() { return GTK_WINDOW (m_window->getWidget()); } - void setCloseCallback (YGWindowCloseFn closeCallback, void *closeData) - { m_window->setCloseCallback (closeCallback, closeData); } - void unsetCloseCallback() - { m_window->unsetCloseCallback(); } + void setCloseCallback (YGWindowCloseFn closeCallback, void *closeData); + void unsetCloseCallback(); void normalCursor(); void busyCursor(); - YGWIDGET_IMPL_COMMON + // convenience function to be used rather than currentDialog() + static YGDialog *currentDialog(); + static GtkWindow *currentWindow(); + YGWIDGET_IMPL_COMMON YGWIDGET_IMPL_CHILD_ADDED (m_containee) YGWIDGET_IMPL_CHILD_REMOVED (m_containee) }; Modified: trunk/gtk/src/YGDumbTab.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGDumbTab.cc?rev=43216&r1... ============================================================================== --- trunk/gtk/src/YGDumbTab.cc (original) +++ trunk/gtk/src/YGDumbTab.cc Thu Dec 20 21:44:06 2007 @@ -15,18 +15,16 @@ { GtkWidget *m_containee; GtkWidget *m_last_tab; - vector <GtkWidget *> m_tab_widgets; public: - YGDumbTab (const YWidgetOpt &opt, YGWidget *parent) - : YDumbTab (opt), + YGDumbTab (YWidget *parent) + : YDumbTab (NULL), YGWidget (this, parent, true, GTK_TYPE_NOTEBOOK, NULL) { IMPL m_containee = gtk_event_box_new(); gtk_widget_show (m_containee); - g_object_ref (G_OBJECT (m_containee)); - gtk_object_sink (GTK_OBJECT (m_containee)); + g_object_ref_sink (G_OBJECT (m_containee)); m_last_tab = 0; // GTK+ keeps the notebook size set to the biggset page. We can't @@ -34,8 +32,8 @@ // reduce its size. ygtk_adj_size_set_only_expand (YGTK_ADJ_SIZE (m_adj_size), TRUE); - g_signal_connect (G_OBJECT (getWidget()), "switch-page", - G_CALLBACK (changed_tab_cb), this); + g_signal_connect_after (G_OBJECT (getWidget()), "switch-page", + G_CALLBACK (changed_tab_cb), this); } ~YGDumbTab() @@ -45,64 +43,102 @@ g_object_unref (G_OBJECT (m_containee)); } - virtual void addTab (const YCPString &label_text) + virtual void addItem (YItem *item) { - IMPL - // the tab label - string str = YGUtils::mapKBAccel (label_text->value_cstr()); - GtkWidget *label = gtk_label_new (str.c_str()); + GtkWidget *tab_label, *image = 0, *label; + + string str = YGUtils::mapKBAccel (item->label()); + label = gtk_label_new_with_mnemonic (str.c_str()); gtk_widget_show (label); + if (item->hasIconName()) { + string path = iconFullPath (item->iconName()); + GdkPixbuf *pixbuf = YGUtils::loadPixbuf (path); + if (pixbuf) + image = gtk_image_new_from_pixbuf (pixbuf); + } + + if (image) { + tab_label = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (tab_label), image, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (tab_label), label, TRUE, TRUE, 0); + } + else + tab_label = label; + gtk_widget_show_all (tab_label); + GtkNotebook *notebook = GTK_NOTEBOOK (getWidget()); g_signal_handlers_block_by_func (notebook, (gpointer) changed_tab_cb, this); - GtkWidget *empty = gtk_event_box_new(); - gtk_widget_show (empty); + GtkWidget *page = gtk_event_box_new(); + gtk_widget_show (page); + item->setData ((void *) page); + g_object_set_data (G_OBJECT (page), "yitem", item); - gtk_notebook_append_page (notebook, empty, label); - m_tab_widgets.push_back (empty); + gtk_notebook_append_page (notebook, page, tab_label); - if (!m_last_tab) - change_tab (0); + if (!m_last_tab) /*first tab*/ + syncTabPage(); g_signal_handlers_unblock_by_func (notebook, (gpointer) changed_tab_cb, this); } + virtual void deleteAllItems() + { + GList *children = gtk_container_get_children (GTK_CONTAINER (getWidget())); + for (GList *i = children; i; i = i->next) + gtk_container_remove (GTK_CONTAINER (getWidget()), (GtkWidget *) i->data); + g_list_free (children); + } + // to re-use the same widget in all tabs (m_fixed), we will remove and // add to the tabs' child as tabs are changed - void change_tab (int tab_nb) + void syncTabPage() { if (m_last_tab) gtk_container_remove (GTK_CONTAINER (m_last_tab), m_containee); - GtkWidget *tab = m_tab_widgets [tab_nb]; + GtkNotebook *notebook = GTK_NOTEBOOK (getWidget()); + int nb = gtk_notebook_get_current_page (notebook); + GtkWidget *tab = gtk_notebook_get_nth_page (notebook, nb); + gtk_container_add (GTK_CONTAINER (tab), m_containee); m_last_tab = tab; } - virtual int getSelectedTabIndex() + virtual YItem *selectedItem() { IMPL - return gtk_notebook_get_current_page (GTK_NOTEBOOK (getWidget())); + GtkNotebook *notebook = GTK_NOTEBOOK (getWidget()); + int nb = gtk_notebook_get_current_page (notebook); + GtkWidget *child = gtk_notebook_get_nth_page (notebook, nb); + return (YItem *) g_object_get_data (G_OBJECT (child), "yitem"); } - virtual void setSelectedTab (int index) + virtual void selectItem (YItem *item, bool selected) { IMPL - change_tab (index); - - g_signal_handlers_block_by_func (getWidget(), (gpointer) changed_tab_cb, this); - gtk_notebook_set_current_page (GTK_NOTEBOOK (getWidget()), index); - g_signal_handlers_unblock_by_func (getWidget(), (gpointer) changed_tab_cb, this); + if (selected) { + GtkWidget *child = (GtkWidget *) item->data(); + int page = gtk_notebook_page_num (GTK_NOTEBOOK (getWidget()), child); + + g_signal_handlers_block_by_func (getWidget(), + (gpointer) changed_tab_cb, this); + gtk_notebook_set_current_page (GTK_NOTEBOOK (getWidget()), page); + g_signal_handlers_unblock_by_func (getWidget(), + (gpointer) changed_tab_cb, this); + syncTabPage(); + } } static void changed_tab_cb (GtkNotebook *notebook, GtkNotebookPage *page, gint tab_nb, YGDumbTab *pThis) { - YCPValue id = pThis->_tabs[tab_nb].id(); - YGUI::ui()->sendEvent (new YMenuEvent (id)); + GtkWidget *child = gtk_notebook_get_nth_page (notebook, tab_nb); + YItem *item = (YItem *) g_object_get_data (G_OBJECT (child), "yitem"); - pThis->change_tab (tab_nb); + YGUI::ui()->sendEvent (new YMenuEvent (item)); + pThis->syncTabPage(); } YGWIDGET_IMPL_COMMON @@ -110,9 +146,9 @@ YGWIDGET_IMPL_CHILD_REMOVED (m_containee) }; -YWidget * -YGUI::createDumbTab (YWidget *parent, YWidgetOpt &opt) +YDumbTab *YGOptionalWidgetFactory::createDumbTab (YWidget *parent) { IMPL - return new YGDumbTab (opt, YGWidget::get (parent)); + return new YGDumbTab (parent); } + Modified: trunk/gtk/src/YGFrame.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGFrame.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGFrame.cc (original) +++ trunk/gtk/src/YGFrame.cc Thu Dec 20 21:44:06 2007 @@ -18,8 +18,8 @@ GtkWidget *m_containee; public: - YGBaseFrame (YWidget *y_widget, YGWidget *parent) - : YGWidget (y_widget, parent, true, GTK_TYPE_FRAME, + YGBaseFrame (YWidget *ywidget, YWidget *parent) + : YGWidget (ywidget, parent, true, GTK_TYPE_FRAME, "shadow-type", GTK_SHADOW_NONE, NULL) { IMPL @@ -36,8 +36,8 @@ class YGFrame : public YFrame, public YGBaseFrame { public: - YGFrame (const YWidgetOpt &opt, YGWidget *parent, const YCPString &label) - : YFrame (opt, label), + YGFrame (YWidget *parent, const string &label) + : YFrame (NULL, label), YGBaseFrame (this, parent) { GtkWidget *label_widget = gtk_label_new (""); @@ -51,18 +51,16 @@ virtual ~YGFrame() {} // YFrame - virtual void setLabel (const YCPString &_str) + virtual void setLabel (const string &_str) { IMPL - /* Get rid of mnemonics; make no sense here. */ - const char *_cstr = _str->value_cstr(); - size_t _clen = strlen (_cstr); - + /* Get rid of mnemonics; makes no sense here. */ + size_t length = _str.length(); string str; - str.reserve (_clen); - for (size_t i = 0; i < _clen; i++) - if (_cstr[i] != '&') - str += _cstr[i]; + str.reserve (length); + for (size_t i = 0; i < length; i++) + if (_str[i] != '&') + str += _str[i]; GtkWidget *label = gtk_frame_get_label_widget (GTK_FRAME (getWidget())); gtk_label_set_text (GTK_LABEL (label), str.c_str()); @@ -75,23 +73,20 @@ YGWIDGET_IMPL_CHILD_REMOVED (getWidget()) }; -YContainerWidget * -YGUI::createFrame (YWidget *parent, YWidgetOpt &opt, - const YCPString &label) + +YFrame *YGWidgetFactory::createFrame (YWidget *parent, const string &label) { IMPL - return new YGFrame (opt, YGWidget::get (parent), label); + return new YGFrame (parent, label); } -#if YAST2_YGUI_CHECKBOX_FRAME #include "YCheckBoxFrame.h" class YGCheckBoxFrame : public YCheckBoxFrame, public YGBaseFrame { public: - YGCheckBoxFrame (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &label, bool checked) - : YCheckBoxFrame (opt, label), + YGCheckBoxFrame (YWidget *parent, const string &label, bool checked) + : YCheckBoxFrame (NULL, label, checked), YGBaseFrame (this, parent) { IMPL @@ -109,40 +104,38 @@ virtual ~YGCheckBoxFrame() {} // YCheckBoxFrame - virtual void setLabel (const YCPString &_str) + virtual void setLabel (const string &_str) { GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget())); GtkLabel *label = GTK_LABEL (GTK_BIN (button)->child); - string str (YGUtils::mapKBAccel (_str->value_cstr())); + string str (YGUtils::mapKBAccel (_str)); gtk_label_set_text_with_mnemonic (label, str.c_str()); YCheckBoxFrame::setLabel (_str); } - bool getValue() + bool value() { GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget())); return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); } - void setValue (bool newValue) + void setValue (bool value) { GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget())); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), newValue); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), value); } virtual void setEnabling (bool enabled) { GtkWidget *frame = getWidget(); - if (enabled) - { + if (enabled) { gtk_widget_set_sensitive (frame, TRUE); - handleChildrenEnablement (getValue()); + handleChildrenEnablement (value()); } - else - { - setChildrenEnabling( false ); + else { gtk_widget_set_sensitive (frame, FALSE); + YWidget::setChildrenEnabled (false); } } @@ -153,19 +146,15 @@ static void toggled_cb (GtkWidget *widget, YGCheckBoxFrame *pThis) { pThis->setEnabling (true); - if (pThis->getNotify()) + if (pThis->notify()) YGUI::ui()->sendEvent (new YWidgetEvent (pThis, YEvent::ValueChanged)); } }; -YContainerWidget * -YGUI::createCheckBoxFrame (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, bool checked) +YCheckBoxFrame *YGWidgetFactory::createCheckBoxFrame (YWidget *parent, const string &label, + bool checked) { IMPL - return new YGCheckBoxFrame (opt, YGWidget::get (parent), label, checked); + return new YGCheckBoxFrame (parent, label, checked); } -#else -# warning "Not compiling CheckBoxFrame..." -#endif /*YAST2_YGUI_CHECKBOX_FRAME*/ Modified: trunk/gtk/src/YGImage.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGImage.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGImage.cc (original) +++ trunk/gtk/src/YGImage.cc Thu Dec 20 21:44:06 2007 @@ -12,67 +12,28 @@ class YGImage : public YImage, public YGWidget { - void setProps (const YWidgetOpt &opt, const YCPString &alt_text) - { - bool scale = opt.scaleToFit.value(), tile = opt.tiled.value(); - YGtkImageAlign align = CENTER_IMAGE_ALIGN; - if (tile) - align = TILE_IMAGE_ALIGN; - if (scale) - align = SCALE_IMAGE_ALIGN; - if (scale && tile) - y2warning ("YImage can't be scaled and tiled at the same time"); - ygtk_image_set_props (YGTK_IMAGE (getWidget()), align, alt_text->value_cstr()); - - bool zeroWidth = opt.zeroWidth.value(), zeroHeight = opt.zeroHeight.value(); - if (zeroWidth || scale || tile) - setStretchable (YD_HORIZ, true); - if (zeroHeight || scale || tile) - setStretchable (YD_VERT, true); - gtk_widget_set_size_request (getWidget(), zeroWidth ? 1 : -1, zeroHeight ? 1 : -1); - } - public: - YGImage (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &filename_str, const YCPString &text) - : YImage (opt), + YGImage (YWidget *parent, const string &filename, bool animated) + : YImage (NULL, filename, animated), YGWidget (this, parent, true, YGTK_TYPE_IMAGE, NULL) { IMPL - setProps (opt, text); - const char *filename = filename_str->value_cstr(); - bool animated = opt.animated.value(); - ygtk_image_set_from_file (YGTK_IMAGE (getWidget()), filename, animated); + ygtk_image_set_from_file (YGTK_IMAGE (getWidget()), filename.c_str(), animated); } - YGImage (const YWidgetOpt &opt, YGWidget *parent, - const YCPByteblock &byteblock, const YCPString &text) - : YImage (opt), - YGWidget (this, parent, true, YGTK_TYPE_IMAGE, NULL) + virtual void setAutoScale (bool scale) { - IMPL - setProps (opt, text); - const guint8 *data = byteblock->value(); - long data_size = byteblock->size(); - bool animated = opt.animated.value(); - ygtk_image_set_from_data (YGTK_IMAGE (getWidget()), data, data_size, animated); + YGtkImageAlign align = CENTER_IMAGE_ALIGN; + if (scale) + align = SCALE_IMAGE_ALIGN; + ygtk_image_set_props (YGTK_IMAGE (getWidget()), align, NULL); } YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createImage (YWidget *parent, YWidgetOpt &opt, - YCPByteblock image_data, YCPString default_text) +YImage *YGWidgetFactory::createImage (YWidget *parent, const string &filename, bool animated) { - IMPL - return new YGImage (opt, YGWidget::get (parent), image_data, default_text); + return new YGImage (parent, filename, animated); } -YWidget * -YGUI::createImage (YWidget *parent, YWidgetOpt &opt, - YCPString file_name, YCPString default_text) -{ - IMPL - return new YGImage (opt, YGWidget::get (parent), file_name, default_text); -} Modified: trunk/gtk/src/YGIntField.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGIntField.cc?rev=43216&r... ============================================================================== --- trunk/gtk/src/YGIntField.cc (original) +++ trunk/gtk/src/YGIntField.cc Thu Dec 20 21:44:06 2007 @@ -4,7 +4,7 @@ #include <config.h> #include <ycp/y2log.h> -#include <YGUI.h> +#include "YGUI.h" #include "YGUtils.h" #include "YGWidget.h" @@ -12,14 +12,13 @@ class YGSpinBox : public YGLabeledWidget { + YIntField *m_yfield; GtkWidget *m_spiner, *m_slider; public: - YGSpinBox (YWidget *y_widget, YGWidget *parent, - const YWidgetOpt &opt, const YCPString &label, - int minValue, int maxValue, int initialValue, - bool show_slider) - : YGLabeledWidget (y_widget, parent, label, YD_HORIZ, true, + YGSpinBox (YWidget *ywidget, YWidget *parent, const string &label, + int minValue, int maxValue, int initialValue, bool show_slider) + : YGLabeledWidget (ywidget, parent, label, YD_HORIZ, true, GTK_TYPE_HBOX, NULL) { m_spiner = gtk_spin_button_new_with_range (minValue, maxValue, 1); @@ -62,7 +61,12 @@ GtkHScale *getSlider() { return GTK_HSCALE (m_slider); } - virtual void reportValue (int newValue) {} + virtual void reportValue (int value) = 0; + + int doGetValue() + { + return gtk_spin_button_get_value_as_int (getSpiner()); + } void doSetValue (int newValue) { @@ -74,10 +78,10 @@ // Events callbacks static void spiner_changed_cb (GtkSpinButton *widget, YGSpinBox *pThis) { - int newValue = gtk_spin_button_get_value_as_int (pThis->getSpiner()); - pThis->reportValue (newValue); + int value = gtk_spin_button_get_value_as_int (pThis->getSpiner()); + pThis->reportValue (value); if (pThis->useSlider()) - gtk_range_set_value (GTK_RANGE (pThis->getSlider()), newValue); + gtk_range_set_value (GTK_RANGE (pThis->getSlider()), value); pThis->emitEvent (YEvent::ValueChanged); } @@ -91,12 +95,14 @@ }; #define YGSPIN_BOX_IMPL_SET_VALUE_CHAIN(ParentClass) \ - virtual void reportValue (int newValue) { \ - ParentClass::setValue (newValue); \ - } \ - virtual void setValue (int newValue) { \ - doSetValue (newValue); \ - reportValue (newValue); \ + virtual void reportValue (int value) { \ + ParentClass::setValue (value); \ + } \ + virtual int value() { \ + return doGetValue(); \ + } \ + virtual void setValueInternal (int value) { \ + doSetValue (value); \ } #include "YIntField.h" @@ -104,25 +110,21 @@ class YGIntField : public YIntField, public YGSpinBox { public: - YGIntField (const YWidgetOpt &opt, YGWidget *parent, const YCPString &label, - int minValue, int maxValue, int initialValue) - : YIntField (opt, label, minValue, maxValue, initialValue) - , YGSpinBox (this, parent, opt, label, minValue, maxValue, initialValue, false) - { } + YGIntField (YWidget *parent, const string &label, int minValue, int maxValue, + int initialValue) + : YIntField (NULL, label, minValue, maxValue) + , YGSpinBox (this, parent, label, minValue, maxValue, initialValue, false) + {} YGWIDGET_IMPL_COMMON YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YIntField) YGSPIN_BOX_IMPL_SET_VALUE_CHAIN (YIntField) }; -YWidget * -YGUI::createIntField (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - int minValue, int maxValue, int initialValue) +YIntField *YGWidgetFactory::createIntField (YWidget *parent, const string &label, + int minValue, int maxValue, int initialValue) { - IMPL - return new YGIntField (opt, YGWidget::get (parent), label, - minValue, maxValue, initialValue); + return new YGIntField (parent, label, minValue, maxValue, initialValue); } #include "YSlider.h" @@ -130,23 +132,21 @@ class YGSlider : public YSlider, public YGSpinBox { public: - YGSlider (const YWidgetOpt &opt, YGWidget *parent, const YCPString &label, - int minValue, int maxValue, int initialValue) - : YSlider (opt, label, minValue, maxValue, initialValue) - , YGSpinBox (this, parent, opt, label, minValue, maxValue, initialValue, true) - { } + YGSlider (YWidget *parent, const string &label, int minValue, int maxValue, + int initialValue) + : YSlider (NULL, label, minValue, maxValue) + , YGSpinBox (this, parent, label, minValue, maxValue, initialValue, true) + {} YGWIDGET_IMPL_COMMON YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YSlider) - YGSPIN_BOX_IMPL_SET_VALUE_CHAIN (YSlider) + YGSPIN_BOX_IMPL_SET_VALUE_CHAIN (YIntField) }; -YWidget * -YGUI::createSlider (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - int minValue, int maxValue, int initialValue) +YSlider *YGOptionalWidgetFactory::createSlider (YWidget *parent, const string &label, + int minValue, int maxValue, int initialValue) { IMPL - return new YGSlider (opt, YGWidget::get (parent), label, - minValue, maxValue, initialValue); + return new YGSlider (parent, label, minValue, maxValue, initialValue); } + Modified: trunk/gtk/src/YGLabel.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGLabel.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGLabel.cc (original) +++ trunk/gtk/src/YGLabel.cc Thu Dec 20 21:44:06 2007 @@ -13,85 +13,35 @@ class YGLabel : public YLabel, public YGWidget { public: - YGLabel (const YWidgetOpt &opt, YGWidget *parent, YCPString text) - : YLabel (opt, text), + YGLabel (YWidget *parent, const string &text, bool heading, bool outputField) + : YLabel (NULL, text, heading, outputField), YGWidget (this, parent, true, GTK_TYPE_LABEL, NULL) { IMPL gtk_misc_set_alignment (GTK_MISC (getWidget()), 0.0, 0.5); - if (opt.isOutputField.value()) + if (outputField) gtk_label_set_selectable (GTK_LABEL (getWidget()), TRUE); - - if (opt.boldFont.value()) - YGUtils::setWidgetFont (getWidget(), PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); - if (opt.isHeading.value()) + if (heading) YGUtils::setWidgetFont (getWidget(), PANGO_WEIGHT_ULTRABOLD, PANGO_SCALE_XX_LARGE); setLabel (text); } - virtual void setLabel (const YCPString &label) + virtual void setText (const string &label) { - gtk_label_set_label (GTK_LABEL (getWidget()), label->value_cstr()); - YLabel::setLabel (label); + gtk_label_set_label (GTK_LABEL (getWidget()), label.c_str()); + YLabel::setText (label); // Some YCP progs have no labeled labels cluttering the layout - label->value().empty() ? gtk_widget_hide (getWidget()) - : gtk_widget_show (getWidget()); + label.empty() ? gtk_widget_hide (getWidget()) : gtk_widget_show (getWidget()); } - // YWidget - virtual bool doSetKeyboardFocus() - { return false; } YGWIDGET_IMPL_COMMON + YGWIDGET_IMPL_USE_BOLD (YLabel) }; -YWidget * -YGUI::createLabel (YWidget *parent, YWidgetOpt &opt, - const YCPString &text) +YLabel *YGWidgetFactory::createLabel (YWidget *parent, const string &text, bool heading, + bool outputField) { - return new YGLabel (opt, YGWidget::get (parent), text); + return new YGLabel (parent, text, heading, outputField); } -#include "YColoredLabel.h" -#include "ygtkbargraph.h" - -class YGColoredLabel : public YColoredLabel, public YGWidget -{ -public: - YGColoredLabel (const YWidgetOpt &opt, YGWidget *parent, YCPString text, - const YColor &fgColor, const YColor &bgColor, int margin) - : YColoredLabel (opt, text), - YGWidget (this, parent, true, YGTK_TYPE_COLORED_LABEL, NULL) - { - IMPL - gtk_misc_set_alignment (GTK_MISC (getWidget()), 0.0, 0.5); - gtk_misc_set_padding (GTK_MISC (getWidget()), margin, margin); - - if (opt.boldFont.value()) - YGUtils::setWidgetFont (getWidget(), PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); - if (opt.isHeading.value()) - YGUtils::setWidgetFont (getWidget(), PANGO_WEIGHT_ULTRABOLD, PANGO_SCALE_XX_LARGE); - setLabel (text); - - YGtkColoredLabel *color_label = YGTK_COLORED_LABEL (getWidget()); - ygtk_colored_label_set_shadow_type (color_label, GTK_SHADOW_OUT); - ygtk_colored_label_set_foreground (color_label, fgColor.red, fgColor.green, fgColor.blue); - ygtk_colored_label_set_background (color_label, bgColor.red, bgColor.green, bgColor.blue); - } - - virtual void setLabel (const YCPString &label) - { - gtk_label_set_label (GTK_LABEL (getWidget()), label->value_cstr()); - YColoredLabel::setLabel (label); - } - - YGWIDGET_IMPL_COMMON -}; - -YWidget * -YGUI::createColoredLabel (YWidget *parent, YWidgetOpt &opt, YCPString label, - YColor fgColor, YColor bgColor, int margin) -{ - return new YGColoredLabel (opt, YGWidget::get (parent), label, - fgColor, bgColor, margin); -} Modified: trunk/gtk/src/YGLayout.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGLayout.cc?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/YGLayout.cc (original) +++ trunk/gtk/src/YGLayout.cc Thu Dec 20 21:44:06 2007 @@ -4,16 +4,16 @@ #include <config.h> #include <ycp/y2log.h> -#include <YGUI.h> +#include "YGUI.h" #include "YGWidget.h" #include "YGUtils.h" -#include "YSplit.h" +#include "YLayoutBox.h" #include "ygtkratiobox.h" #include "YSpacing.h" // GtkBox-like container (actually, more like our YGtkRatioBox) -class YGSplit : public YSplit, public YGWidget +class YGLayoutBox : public YLayoutBox, public YGWidget { // This group is meant to set all YGLabeledWidget with horizontal label // to share the same width (if they belong to the same YSplit), so they @@ -21,48 +21,45 @@ GtkSizeGroup *m_labels_group; public: - YGSplit (const YWidgetOpt &opt, YGWidget *parent, YUIDimension dim) - : YSplit (opt, dim), + YGLayoutBox (YWidget *parent, YUIDimension dim) + : YLayoutBox (NULL, dim), YGWidget (this, parent, true, - dim == YD_HORIZ ? YGTK_TYPE_RATIO_HBOX - : YGTK_TYPE_RATIO_VBOX, NULL) + dim == YD_HORIZ ? YGTK_TYPE_RATIO_HBOX : YGTK_TYPE_RATIO_VBOX, NULL) { setBorder (0); m_labels_group = NULL; } - ~YGSplit() + ~YGLayoutBox() { if (m_labels_group) g_object_unref (G_OBJECT (m_labels_group)); } - virtual void childAdded (YWidget *ychild) + virtual string getDebugLabel() const + { return primary() == YD_HORIZ ? "horizontal" : "vertical"; } + + virtual void doAddChild (YWidget *ychild, GtkWidget *container) { IMPL - YGWidget *ygchild = YGWidget::get (ychild); - - gtk_container_add (GTK_CONTAINER (getWidget()), ygchild->getLayout()); - sync_stretchable (ychild); + YGWidget::doAddChild (ychild, container); // set labels of YGLabeledWidgets to the same width // we have to do quite some work due to over-clutter on YCP progs while (ychild) { - if (ychild->isContainer()) { + if (ychild->hasChildren()) { // container // try to see if there is a YGLabeledWidget at start // (and ignore YSpacings) - YContainerWidget *container = (YContainerWidget *) ychild; - if (container->numChildren()) - for (int i = 0; i < container->numChildren(); i++) { - ychild = container->child (i); - if (!dynamic_cast <YSpacing *> (ychild)) - break; - } - else // no kids - break; + YWidget *container = ychild; + for (YWidgetListConstIterator it = container->childrenBegin(); + it != container->childrenEnd(); it++) { + ychild = *it; + if (!dynamic_cast <YSpacing *> (ychild)) + break; + } } else { - ygchild = YGWidget::get (ychild); + YGWidget *ygchild = YGWidget::get (ychild); YGLabeledWidget *labeled_child = dynamic_cast <YGLabeledWidget *> (ygchild); if (labeled_child && labeled_child->orientation() == YD_HORIZ) { if (!m_labels_group) @@ -74,6 +71,8 @@ } } } + + YGWIDGET_IMPL_CHILD_ADDED (getWidget()) YGWIDGET_IMPL_CHILD_REMOVED (getWidget()) virtual void sync_stretchable (YWidget *ychild) @@ -82,28 +81,24 @@ YGtkRatioBox *box = YGTK_RATIO_BOX (getWidget()); YGWidget *child = YGWidget::get (ychild); - YUIDimension dim = dimension(); - bool horiz_fill = child->isStretchable (YD_HORIZ) - || ychild->hasWeight (YD_HORIZ); - bool vert_fill = child->isStretchable (YD_VERT) - || ychild->hasWeight (YD_VERT); + YUIDimension dim = primary(); + bool horiz_fill = ychild->stretchable (YD_HORIZ) || ychild->hasWeight (YD_HORIZ); + bool vert_fill = ychild->stretchable (YD_VERT) || ychild->hasWeight (YD_VERT); ygtk_ratio_box_set_child_packing (box, child->getLayout(), ychild->weight (dim), horiz_fill, vert_fill, 0); ygtk_ratio_box_set_child_expand (box, child->getLayout(), - child->isStretchable (dim), - ychild->isLayoutStretch (dim)); + ychild->stretchable (dim), isLayoutStretch (ychild, dim)); YGWidget::sync_stretchable(); } - virtual void moveChild (YWidget *, long, long) {} // ignore + virtual void moveChild (YWidget *, int, int) {} // ignore }; -YContainerWidget * -YGUI::createSplit (YWidget *parent, YWidgetOpt &opt, YUIDimension dimension) +YLayoutBox *YGWidgetFactory::createLayoutBox (YWidget *parent, YUIDimension dimension) { IMPL - return new YGSplit (opt, YGWidget::get (parent), dimension); + return new YGLayoutBox (parent, dimension); } #include "YAlignment.h" @@ -113,9 +108,8 @@ GdkPixbuf *m_background_pixbuf; public: - YGAlignment (const YWidgetOpt &opt, YGWidget *parent, - YAlignmentType halign, YAlignmentType valign) - : YAlignment (opt, halign, valign), + YGAlignment (YWidget *parent, YAlignmentType halign, YAlignmentType valign) + : YAlignment (NULL, halign, valign), YGWidget (this, parent, true, GTK_TYPE_ALIGNMENT, NULL) { setBorder (0); @@ -128,50 +122,41 @@ g_object_unref (G_OBJECT (m_background_pixbuf)); } - virtual void childAdded (YWidget *ychild) + virtual void doAddChild (YWidget *ychild, GtkWidget *container) { - YGWidget *child = YGWidget::get (ychild); - gtk_container_add (GTK_CONTAINER (getWidget()), child->getLayout()); + YGWidget::doAddChild (ychild, container); /* The padding is used for stuff like making YCP progs nicer for yast-qt wizard, so it hurts us -- it's disabled. */ //child->setPadding (topMargin(), bottomMargin(), // leftMargin(), rightMargin()); setMinSize (minWidth(), minHeight()); - - sync_stretchable (ychild); // alignment will be set here } + YGWIDGET_IMPL_CHILD_ADDED (m_widget) YGWIDGET_IMPL_CHILD_REMOVED (m_widget) virtual void sync_stretchable (YWidget *child) { IMPL - setAlignment (align [YD_HORIZ], align [YD_VERT]); - YGWidget::sync_stretchable (m_y_widget); + setAlignment (alignment (YD_HORIZ), alignment (YD_VERT)); + YGWidget::sync_stretchable(); } void setAlignment (YAlignmentType halign, YAlignmentType valign) { - // special case (which YAlignment.cc also uses); let stretchable - // children stretch if opt.stretch is set (exploitable by the wizard) - GValue hstretch, vstretch; - hstretch = YGUtils::floatToGValue (0); - if (_stretch [YD_HORIZ] && YGWidget::get (child (0))->isStretchable (YD_HORIZ)) - hstretch = YGUtils::floatToGValue (1); - vstretch = YGUtils::floatToGValue (0); - if (_stretch [YD_VERT] && YGWidget::get (child (0))->isStretchable (YD_VERT)) - vstretch = YGUtils::floatToGValue (1); - - if (halign != YAlignUnchanged) { - GValue xalign = YGUtils::floatToGValue (yToGtkAlign (halign)); - g_object_set_property (G_OBJECT (getWidget()), "xalign", &xalign); - g_object_set_property (G_OBJECT (getWidget()), "xscale", &hstretch); - } - if (valign != YAlignUnchanged) { - GValue yalign = YGUtils::floatToGValue (yToGtkAlign (valign)); - g_object_set_property (G_OBJECT (getWidget()), "yalign", &yalign); - g_object_set_property (G_OBJECT (getWidget()), "yscale", &vstretch); - } + bool hstretch = halign == YAlignUnchanged || stretchable (YD_HORIZ); + bool vstretch = valign == YAlignUnchanged || stretchable (YD_VERT); + + GValue xalign, yalign, xscale, yscale; + xalign = YGUtils::floatToGValue (yToGtkAlign (halign)); + yalign = YGUtils::floatToGValue (yToGtkAlign (valign)); + xscale = YGUtils::floatToGValue (hstretch ? 1 : 0); + yscale = YGUtils::floatToGValue (vstretch ? 1 : 0); + + g_object_set_property (G_OBJECT (getWidget()), "xalign", &xalign); + g_object_set_property (G_OBJECT (getWidget()), "yalign", &yalign); + g_object_set_property (G_OBJECT (getWidget()), "xscale", &xscale); + g_object_set_property (G_OBJECT (getWidget()), "yscale", &yscale); } void setPadding (int top, int bottom, int left, int right) @@ -225,7 +210,7 @@ return TRUE; } - virtual void moveChild (YWidget *, long, long) {}; // ignore + virtual void moveChild (YWidget *, int, int) {}; // ignore virtual string getDebugLabel() const { @@ -247,9 +232,9 @@ }; string str; - str += inner::alignLabel (align [YD_HORIZ]); + str += inner::alignLabel (alignment (YD_HORIZ)); str += " x "; - str += inner::alignLabel (align [YD_VERT]); + str += inner::alignLabel (alignment (YD_VERT)); return str; } @@ -266,12 +251,11 @@ } }; -YContainerWidget * -YGUI::createAlignment (YWidget *parent, YWidgetOpt &opt, - YAlignmentType halign, YAlignmentType valign) +YAlignment *YGWidgetFactory::createAlignment (YWidget *parent, YAlignmentType halign, + YAlignmentType valign) { IMPL - return new YGAlignment (opt, YGWidget::get (parent), halign, valign); + return new YGAlignment (parent, halign, valign); } #include "YEmpty.h" @@ -280,19 +264,20 @@ class YGEmpty : public YEmpty, public YGWidget { public: - YGEmpty (const YWidgetOpt &opt, YGWidget *parent) - : YEmpty (opt), + YGEmpty (YWidget *parent) + : YEmpty (NULL), YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) { setBorder (0); } + + YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createEmpty (YWidget *parent, YWidgetOpt &opt) +YEmpty *YGWidgetFactory::createEmpty (YWidget *parent) { IMPL - return new YGEmpty (opt, YGWidget::get (parent)); + return new YGEmpty (parent); } #include "YSpacing.h" @@ -301,32 +286,35 @@ class YGSpacing : public YSpacing, public YGWidget { public: - YGSpacing (const YWidgetOpt &opt, YGWidget *parent, - float size, bool horizontal, bool vertical) - : YSpacing (opt, size, horizontal, vertical), + YGSpacing (YWidget *parent, YUIDimension dim, bool stretchable, YLayoutSize_t size) + : YSpacing (NULL, dim, stretchable, size), YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) { setBorder (0); - gtk_widget_set_size_request (getWidget(), width(), height()); + int width = YSpacing::size (YD_HORIZ), height = YSpacing::size (YD_VERT); + gtk_widget_set_size_request (getWidget(), width, height); } + + YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createSpacing (YWidget *parent, YWidgetOpt & opt, float size, - bool horiz, bool vert) +YSpacing *YGWidgetFactory::createSpacing (YWidget *parent, YUIDimension dim, + bool stretchable, YLayoutSize_t size) { - IMPL - return new YGSpacing (opt, YGWidget::get (parent), size, horiz, vert); + return new YGSpacing (parent, dim, stretchable, size); } #include "YReplacePoint.h" +//TEMP: +#include "YPushButton.h" + // an empty space that will get replaced class YGReplacePoint : public YReplacePoint, public YGWidget { public: - YGReplacePoint (const YWidgetOpt &opt, YGWidget *parent) - : YReplacePoint (opt), + YGReplacePoint (YWidget *parent) + : YReplacePoint (NULL), YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) { setBorder (0); @@ -336,11 +324,10 @@ YGWIDGET_IMPL_CHILD_REMOVED (getWidget()) }; -YContainerWidget * -YGUI::createReplacePoint( YWidget *parent, YWidgetOpt & opt ) +YReplacePoint *YGWidgetFactory::createReplacePoint (YWidget *parent) { IMPL - return new YGReplacePoint (opt, YGWidget::get (parent)); + return new YGReplacePoint (parent); } #include "YSquash.h" @@ -350,9 +337,8 @@ class YGSquash : public YSquash, public YGWidget { public: - YGSquash (const YWidgetOpt &opt, YGWidget *parent, - bool hsquash, bool vsquash) - : YSquash (opt, hsquash, vsquash), + YGSquash (YWidget *parent, bool hsquash, bool vsquash) + : YSquash (NULL, hsquash, vsquash), YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) { setBorder (0); @@ -362,10 +348,9 @@ YGWIDGET_IMPL_CHILD_REMOVED (getWidget()) }; -YContainerWidget * -YGUI::createSquash (YWidget *parent, YWidgetOpt &opt, - bool hsquash, bool vsquash) +YSquash *YGWidgetFactory::createSquash (YWidget *parent, bool hsquash, bool vsquash) { IMPL - return new YGSquash (opt, YGWidget::get (parent), hsquash, vsquash); + return new YGSquash (parent, hsquash, vsquash); } + Modified: trunk/gtk/src/YGMenuButton.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGMenuButton.cc?rev=43216... ============================================================================== --- trunk/gtk/src/YGMenuButton.cc (original) +++ trunk/gtk/src/YGMenuButton.cc Thu Dec 20 21:44:06 2007 @@ -13,48 +13,48 @@ class YGMenuButton : public YMenuButton, public YGWidget { public: - YGMenuButton (const YWidgetOpt &opt, - YGWidget *parent, - YCPString label) - : YMenuButton (opt, label), + YGMenuButton (YWidget *parent, const string &label) + : YMenuButton (NULL, label), YGWidget (this, parent, true, YGTK_TYPE_MENU_BUTTON, NULL) { IMPL - setLabel (label); - } - - virtual ~YGMenuButton() {} - - // YMenuButton - virtual void setLabel (const YCPString &label) - { - IMPL - string str = YGUtils::mapKBAccel (label->value_cstr()); + string str = YGUtils::mapKBAccel (label.c_str()); ygtk_menu_button_set_label (YGTK_MENU_BUTTON (getWidget()), str.c_str()); - YMenuButton::setLabel (label); } // YMenuButton - virtual void createMenu() + virtual void rebuildMenuTree() { - GtkWidget *menu = doCreateMenu (getToplevelMenu()->itemList()); + GtkWidget *menu = doCreateMenu (itemsBegin(), itemsEnd()); gtk_widget_show_all (menu); ygtk_menu_button_set_popup (YGTK_MENU_BUTTON (getWidget()), menu); } - static GtkWidget* doCreateMenu (YMenuItemList &items) + static GtkWidget* doCreateMenu (YItemIterator begin, YItemIterator end) { GtkWidget *menu = gtk_menu_new(); - for (YMenuItemListIterator it = items.begin(); it != items.end(); it++) { - GtkWidget *entry; - string str = YGUtils::mapKBAccel ((*it)->getLabel()->value_cstr()); - entry = gtk_menu_item_new_with_mnemonic (str.c_str()); + for (YItemIterator it = begin; it != end; it++) { + GtkWidget *entry, *image = 0; + string str = YGUtils::mapKBAccel ((*it)->label()); + + if ((*it)->hasIconName()) { + GdkPixbuf *pixbuf = YGUtils::loadPixbuf ((*it)->iconName()); + if (pixbuf) + image = gtk_image_new_from_pixbuf (pixbuf); + } + + if (image) { + entry = gtk_image_menu_item_new_with_mnemonic (str.c_str()); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (entry), image); + } + else + entry = gtk_menu_item_new_with_mnemonic (str.c_str()); gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry); if ((*it)->hasChildren()) gtk_menu_item_set_submenu (GTK_MENU_ITEM (entry), - doCreateMenu ((*it)->itemList())); + doCreateMenu ((*it)->childrenBegin(), (*it)->childrenEnd())); else g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (selected_item_cb), *it); @@ -63,17 +63,16 @@ return menu; } - static void selected_item_cb (GtkMenuItem *menuitem, YMenuItem *yitem) + static void selected_item_cb (GtkMenuItem *menuitem, YItem *item) { - YGUI::ui()->sendEvent (new YMenuEvent (yitem->getId())); + YGUI::ui()->sendEvent (new YMenuEvent (item)); } YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createMenuButton (YWidget *parent, YWidgetOpt &opt, - const YCPString &label) +YMenuButton *YGWidgetFactory::createMenuButton (YWidget *parent, const string &label) { - return new YGMenuButton (opt, YGWidget::get (parent), label); + return new YGMenuButton (parent, label); } + Modified: trunk/gtk/src/YGMultiLineEdit.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGMultiLineEdit.cc?rev=43... ============================================================================== --- trunk/gtk/src/YGMultiLineEdit.cc (original) +++ trunk/gtk/src/YGMultiLineEdit.cc Thu Dec 20 21:44:06 2007 @@ -14,19 +14,15 @@ int maxChars; public: - YGTextView (YWidget *y_widget, YGWidget *parent, const YWidgetOpt &opt, - const YCPString &label, const YCPString &text, bool editable) - : YGScrolledWidget (y_widget, parent, label, YD_VERT, true, + YGTextView (YWidget *ywidget, YWidget *parent, const string &label, bool editable) + : YGScrolledWidget (ywidget, parent, label, YD_VERT, true, GTK_TYPE_TEXT_VIEW, "wrap-mode", GTK_WRAP_WORD, NULL) { IMPL - if (!opt.isShrinkable.value()) - setMinSizeInChars (20, 10); + setMinSizeInChars (20, 10); setPolicy (GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); maxChars = -1; - setText (text); - if (!editable) { gtk_text_view_set_editable (GTK_TEXT_VIEW (getWidget()), FALSE); @@ -66,20 +62,20 @@ g_signal_handlers_unblock_by_func (getWidget(), (gpointer) text_changed_cb, this); } - void setText (const YCPString &text) + void setText (const string &text) { IMPL - gtk_text_buffer_set_text (getBuffer(), text->value_cstr(), -1); + gtk_text_buffer_set_text (getBuffer(), text.c_str(), -1); } - YCPString getText() + string getText() { IMPL GtkTextIter start_it, end_it; gtk_text_buffer_get_bounds (getBuffer(), &start_it, &end_it); gchar* text = gtk_text_buffer_get_text (getBuffer(), &start_it, &end_it, FALSE); - YCPString str (text); + string str (text); g_free (text); return str; } @@ -105,31 +101,31 @@ class YGMultiLineEdit : public YMultiLineEdit, public YGTextView { public: - YGMultiLineEdit (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &label, const YCPString &text) - : YMultiLineEdit (opt, label) - , YGTextView (this, parent, opt, label, text, true) - { } + YGMultiLineEdit (YWidget *parent, const string &label) + : YMultiLineEdit (NULL, label) + , YGTextView (this, parent, label, true) + {} // YMultiLineEdit - virtual void setText (const YCPString &text) + virtual void setValue (const string &text) { YGTextView::setText (text); } - virtual YCPString text() + virtual string value() { return YGTextView::getText(); } - virtual void setInputMaxLength (const YCPInteger &numberOfChars) - { YGTextView::setCharsNb (numberOfChars->asInteger()->value()); } + virtual void setInputMaxLength (int nb) + { + YGTextView::setCharsNb (nb); + YMultiLineEdit::setInputMaxLength (nb); + } YGWIDGET_IMPL_COMMON YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN(YMultiLineEdit) }; -YWidget * -YGUI::createMultiLineEdit (YWidget *parent, YWidgetOpt & opt, - const YCPString & label, const YCPString & text) +YMultiLineEdit *YGWidgetFactory::createMultiLineEdit (YWidget *parent, const string &label) { - return new YGMultiLineEdit (opt, YGWidget::get (parent), label, text); + return new YGMultiLineEdit (parent, label); } #include "YLogView.h" @@ -137,16 +133,13 @@ class YGLogView : public YLogView, public YGTextView { public: - YGLogView (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &label, int visibleLines, int maxLines) - : YLogView (opt, label, visibleLines, maxLines) - , YGTextView (this, parent, opt, label, YCPString(""), false) - { - setMinSizeInChars (0, visibleLines); - } + YGLogView (YWidget *parent, const string &label, int visibleLines, int maxLines) + : YLogView (NULL, label, visibleLines, maxLines) + , YGTextView (this, parent, label, false) + {} // YLogView - virtual void setLogText (const YCPString &text) + virtual void displayLogText (const string &text) { setText (text); scrollToBottom(); @@ -156,13 +149,10 @@ YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN(YLogView) }; -YWidget * -YGUI::createLogView (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, int visibleLines, - int maxLines) +YLogView *YGWidgetFactory::createLogView (YWidget *parent, const string &label, + int visibleLines, int maxLines) { - return new YGLogView (opt, YGWidget::get (parent), - label, visibleLines, maxLines); + return new YGLogView (parent, label, visibleLines, maxLines); } #include "YRichText.h" @@ -172,22 +162,22 @@ bool m_autoScrollDown; public: - YGPlainText(const YWidgetOpt &opt, YGWidget *parent, const YCPString &text) - : YRichText (opt, text) - , YGTextView (this, parent, opt, YCPString(""), text, false) + YGPlainText(YWidget *parent, const string &text) + : YRichText (NULL, text) + , YGTextView (this, parent, string(), false) { - IMPL - m_autoScrollDown = opt.autoScrollDown.value(); + if (shrinkable()) + setMinSizeInChars (0, 0); } // YRichText - virtual void setText (const YCPString &text) + virtual void setValue (const string &text) { IMPL YGTextView::setText (text); - if (m_autoScrollDown) + if (autoScrollDown()) scrollToBottom(); - YRichText::setText (text); + YRichText::setValue (text); } YGWIDGET_IMPL_COMMON @@ -197,35 +187,31 @@ class YGRichText : public YRichText, public YGScrolledWidget { -bool m_autoScrollDown; - public: - YGRichText(const YWidgetOpt &opt, YGWidget *parent, const YCPString &text) - : YRichText (opt, text) + YGRichText (YWidget *parent, const string &text) + : YRichText (NULL, text) , YGScrolledWidget (this, parent, true, ygtk_html_wrap_get_type(), NULL) { IMPL - if (!opt.isShrinkable.value()) + if (!shrinkable()) setMinSizeInChars (20, 8); - m_autoScrollDown = opt.autoScrollDown.value(); ygtk_html_wrap_init (getWidget()); ygtk_html_wrap_connect_link_clicked (getWidget(), G_CALLBACK (link_clicked_cb), this); - - setText (text); + setValue (text); } // YRichText - virtual void setText (const YCPString &_text) + virtual void setValue (const string &_text) { IMPL - string text (_text->value()); + string text (_text); YGUtils::replace (text, "&product;", 9, YUI::ui()->productName().c_str()); ygtk_html_wrap_set_text (getWidget(), text.c_str()); - if (m_autoScrollDown) + if (autoScrollDown()) ygtk_html_wrap_scroll (getWidget(), FALSE); - YRichText::setText (_text); + YRichText::setValue (_text); } static void link_clicked_cb (GtkWidget *widget, const char *url, YGRichText *pThis) @@ -236,13 +222,13 @@ YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createRichText (YWidget *parent, YWidgetOpt &opt, const YCPString &text) +YRichText *YGWidgetFactory::createRichText (YWidget *parent, const string &text, + bool plainTextMode) { - if (opt.plainTextMode.value()) - return new YGPlainText (opt, YGWidget::get (parent), text); + if (plainTextMode) + return new YGPlainText (parent, text); else - return new YGRichText (opt, YGWidget::get (parent), text); + return new YGRichText (parent, text); } #if 0 Modified: trunk/gtk/src/YGPackageSelector.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGPackageSelector.cc?rev=... ============================================================================== --- trunk/gtk/src/YGPackageSelector.cc (original) +++ trunk/gtk/src/YGPackageSelector.cc Thu Dec 20 21:44:06 2007 @@ -10,8 +10,11 @@ #include "YGi18n.h" #include "YGDialog.h" +#if 1 #include "ygtkwizard.h" #include "ygtkfindentry.h" +#include "ygtkscrolledwindow.h" +#include "ygtktogglebutton.h" #include "ygtkhtmlwrap.h" #include "ygtkzyppwrapper.h" @@ -25,9 +28,9 @@ return image; } -#define FILEMANAGER_EXEC "/usr/bin/nautilus" +#define FILEMANAGER_EXEC "/usr/bin/nautilus -n --no-desktop" inline void FILEMANAGER_LAUNCH (const char *path) -{ system ((std::string (FILEMANAGER_EXEC) + " -n --no-desktop " + path + " &").c_str()); } +{ system ((std::string (FILEMANAGER_EXEC) + " " + path + " &").c_str()); } static void busyCursor() { @@ -93,23 +96,24 @@ { GtkTreeView *view = GTK_TREE_VIEW (m_widget = gtk_tree_view_new()); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE); - gtk_tree_view_set_search_column (GTK_TREE_VIEW (view), 1); + gtk_tree_view_set_search_column (GTK_TREE_VIEW (view), YGtkZyppModel::NAME_COLUMN); GtkTreeViewColumn *column; GtkCellRenderer *renderer; renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes ("", renderer, "pixbuf", YGtkZyppModel::ICON_COLUMN, NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (column, 38); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); renderer = gtk_cell_renderer_text_new(); g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); column = gtk_tree_view_column_new_with_attributes ("", renderer, "markup", YGtkZyppModel::NAME_DESCRIPTION_COLUMN, NULL); + gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (column, 50 /* it will expand */); gtk_tree_view_column_set_expand (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); - renderer = gtk_cell_renderer_pixbuf_new(); - column = gtk_tree_view_column_new_with_attributes ("", renderer, - "pixbuf", YGtkZyppModel::SPECIAL_ICON_COLUMN, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); + gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE); GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); @@ -165,41 +169,25 @@ } }; -GtkWidget *m_box, *m_bin, *m_list_button, *m_icon_button; +GtkWidget *m_bin; GtkTreeModel *m_model; View *m_view; public: GtkWidget *getWidget() - { return m_box; } + { return m_bin; } PackagesView() : m_listener (NULL), m_model (NULL), m_view (NULL) { - m_bin = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (m_bin), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_bin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - - GtkWidget *buttons = gtk_vbox_new (FALSE, 0), *image; - image = createImageFromXPM (pkg_list_mode_xpm); - m_list_button = gtk_toggle_button_new(); - gtk_button_set_image (GTK_BUTTON (m_list_button), image); - image = createImageFromXPM (pkg_tiles_mode_xpm); - m_icon_button = gtk_toggle_button_new(); - gtk_button_set_image (GTK_BUTTON (m_icon_button), image); - gtk_box_pack_start (GTK_BOX (buttons), gtk_label_new(""), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (buttons), m_list_button, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (buttons), m_icon_button, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (m_list_button), "toggled", - G_CALLBACK (mode_toggled_cb), this); - g_signal_connect (G_OBJECT (m_icon_button), "toggled", - G_CALLBACK (mode_toggled_cb), this); - - m_box = gtk_hbox_new (FALSE, 2); - gtk_box_pack_start (GTK_BOX (m_box), m_bin, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_box), buttons, FALSE, TRUE, 0); + GtkWidget *buttons = gtk_vbox_new (FALSE, 0), *button; + button = create_toggle_button (pkg_list_mode_xpm, "List view", NULL); + gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0); + button = create_toggle_button (pkg_tiles_mode_xpm, "Tiles view", button); + gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0); + gtk_widget_show_all (buttons); + m_bin = ygtk_scrolled_window_new(); + ygtk_scrolled_window_set_corner_widget (YGTK_SCROLLED_WINDOW (m_bin), buttons); setMode (LIST_MODE); } @@ -217,14 +205,6 @@ { if (GTK_WIDGET_REALIZED (m_bin)) busyCursor(); - g_signal_handlers_block_by_func (m_list_button, (gpointer) mode_toggled_cb, this); - g_signal_handlers_block_by_func (m_icon_button, (gpointer) mode_toggled_cb, this); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_list_button), mode == LIST_MODE); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_icon_button), mode == ICON_MODE); - - g_signal_handlers_unblock_by_func (m_list_button, (gpointer) mode_toggled_cb, this); - g_signal_handlers_unblock_by_func (m_icon_button, (gpointer) mode_toggled_cb, this); if (m_view) gtk_container_remove (GTK_CONTAINER (m_bin), m_view->m_widget); @@ -233,15 +213,15 @@ m_view = new ListView (this); else m_view = new IconView (this); -fprintf (stderr, "adding new view to container\n"); gtk_container_add (GTK_CONTAINER (m_bin), m_view->m_widget); if (m_model) m_view->setModel (m_model); + packagesSelected (std::list <Ypp::Package *> ()); normalCursor(); } - void query (Ypp::Query *query) + void setQuery (Ypp::Query *query) { if (GTK_WIDGET_REALIZED (m_bin)) busyCursor(); @@ -259,90 +239,555 @@ } private: - static void mode_toggled_cb (GtkToggleButton *toggle, PackagesView *pThis) + GtkWidget *create_toggle_button (const char **xpm, const char *tooltip, GtkWidget *member) { - bool active = gtk_toggle_button_get_active (toggle); - if (!active) { - // don't let the button be un-pressed - g_signal_handlers_block_by_func (toggle, (gpointer) mode_toggled_cb, pThis); - gtk_toggle_button_set_active (toggle, TRUE); - g_signal_handlers_unblock_by_func (toggle, (gpointer) mode_toggled_cb, pThis); - return; - } - ViewMode mode = GTK_WIDGET (toggle) == pThis->m_list_button ? LIST_MODE : ICON_MODE; + GSList *group = NULL; + if (member) + group = ygtk_toggle_button_get_group (YGTK_TOGGLE_BUTTON (member)); + GtkWidget *button = ygtk_toggle_button_new (group); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); + if (!member) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); + + // make it tiny + GtkRcStyle *rcstyle = gtk_rc_style_new(); + rcstyle->xthickness = rcstyle->ythickness = 0; + gtk_widget_modify_style (button, rcstyle); + gtk_rc_style_unref (rcstyle), + + gtk_widget_set_tooltip_text (button, tooltip); + g_signal_connect (G_OBJECT (button), "toggle-changed", + G_CALLBACK (mode_toggled_cb), this); + + GtkWidget *image = createImageFromXPM (xpm); + gtk_container_add (GTK_CONTAINER (button), image); + return button; + } + + static void mode_toggled_cb (GtkToggleButton *toggle, gint nb, PackagesView *pThis) + { + ViewMode mode = (nb == 0) ? LIST_MODE : ICON_MODE; pThis->setMode (mode); } }; -// TEMP: a window of modified packages -class TrashWindow : PackagesView::Listener +class ChangesPane : public Ypp::Pool::Listener { -GtkWidget *m_window, *m_undo_button; -PackagesView *m_view; + struct Entry { + GtkWidget *m_box, *m_label, *m_button; + GtkWidget *getWidget() { return m_box; } + + Entry (Ypp::Package *package) + { + m_label = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (m_label), 0, 0.5); + gtk_label_set_ellipsize (GTK_LABEL (m_label), PANGO_ELLIPSIZE_END); + m_button = gtk_button_new(); + gtk_widget_set_tooltip_text (m_button, _("Undo")); + GtkWidget *undo_image = gtk_image_new_from_stock (GTK_STOCK_UNDO, GTK_ICON_SIZE_MENU); + gtk_button_set_image (GTK_BUTTON (m_button), undo_image); + m_box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (m_box), m_label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (m_box), m_button, FALSE, FALSE, 0); + gtk_widget_set_size_request (m_box, 140, -1); + gtk_widget_show_all (m_box); + modified (package); + g_signal_connect (G_OBJECT (m_label), "style-set", + G_CALLBACK (style_set_cb), NULL); + g_signal_connect (G_OBJECT (m_button), "clicked", + G_CALLBACK (undo_clicked_cb), package); + } + + void modified (Ypp::Package *package) + { + std::string text; + if (package->isInstalled() && package->toInstall()) + text = "upgrade"; + else if (package->toInstall()) + text = "install"; + else + text = "remove"; + text += " " + package->name(); + if (package->isAuto()) { + text = "\t" + text; + gtk_widget_hide (m_button); + } + else + gtk_widget_show (m_button); + gtk_label_set_text (GTK_LABEL (m_label), text.c_str()); + } + + static void undo_clicked_cb (GtkButton *button, Ypp::Package *package) + { + package->undo(); + } + + static void style_set_cb (GtkWidget *widget, GtkStyle *prev_style) + { + static bool set_style = false; + if (set_style) + return; + set_style = true; + GdkColor *color = &widget->style->fg [GTK_STATE_SELECTED]; + gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, color); + set_style = false; + } + }; + +GtkWidget *m_box, *m_entries_box, *m_container; +Ypp::Pool *m_pool; +GList *m_entries; public: - TrashWindow() + GtkWidget *getWidget() + { return m_box; } + + ChangesPane() + : m_entries (NULL) { - m_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (m_window), "Changes"); - gtk_window_set_default_size (GTK_WINDOW (m_window), 200, 250); + GtkWidget *heading = gtk_label_new (_("Changes:")); + YGUtils::setWidgetFont (heading, PANGO_WEIGHT_ULTRABOLD, PANGO_SCALE_LARGE); + gtk_misc_set_alignment (GTK_MISC (heading), 0, 0.5); + g_signal_connect (G_OBJECT (heading), "style-set", + G_CALLBACK (Entry::style_set_cb), NULL); + m_entries_box = gtk_vbox_new (FALSE, 4); + + GtkWidget *port = gtk_viewport_new (NULL, NULL); + gtk_viewport_set_shadow_type (GTK_VIEWPORT (port), GTK_SHADOW_NONE); + gtk_container_add (GTK_CONTAINER (port), m_entries_box); + + GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (scroll), port); + + GtkWidget *vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); + gtk_box_pack_start (GTK_BOX (vbox), heading, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0); + + m_box = gtk_event_box_new(); + gtk_container_add (GTK_CONTAINER (m_box), vbox); + g_signal_connect_after (G_OBJECT (m_box), "style-set", + G_CALLBACK (style_set_cb), NULL); + g_signal_connect_after (G_OBJECT (scroll), "style-set", + G_CALLBACK (style_set_cb), NULL); + g_signal_connect_after (G_OBJECT (port), "style-set", + G_CALLBACK (style_set_cb), NULL); - m_view = new PackagesView(); - Ypp::Query *query = new Ypp::Query (Ypp::Package::PACKAGE_TYPE); + Ypp::Query *query = new Ypp::Query(); query->setIsModified (true); - m_view->query (query); - m_view->setListener (this); + m_pool = new Ypp::Pool (query); + m_pool->setListener (this); + } - GtkWidget *vbox = gtk_vbox_new (FALSE, 6), *undo_align; - m_undo_button = gtk_button_new_from_stock (GTK_STOCK_UNDO); - gtk_widget_set_sensitive (m_undo_button, FALSE); - g_signal_connect (G_OBJECT (m_undo_button), "clicked", - G_CALLBACK (undo_clicked_cb), this); - undo_align = gtk_alignment_new (1, 0, 0, 0); - gtk_container_add (GTK_CONTAINER (undo_align), m_undo_button); + ~ChangesPane() + { + delete m_pool; + for (GList *i = m_entries; i; i = i->next) + delete (Entry *) i->data; + g_list_free (m_entries); + } - gtk_box_pack_start (GTK_BOX (vbox), m_view->getWidget(), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), undo_align, FALSE, FALSE, 0); - gtk_container_add (GTK_CONTAINER (m_window), vbox); - gtk_widget_show_all (m_window); + void setContainer (GtkWidget *container) + { + m_container = container; + gtk_widget_hide (m_container); } - ~TrashWindow() + virtual void entryInserted (Ypp::Pool::Iter iter, Ypp::Package *package) { - delete m_view; - gtk_widget_destroy (m_window); + Entry *entry = new Entry (package); + gtk_box_pack_start (GTK_BOX (m_entries_box), entry->getWidget(), FALSE, TRUE, 0); + int index = m_pool->getIndex (iter); + m_entries = g_list_insert (m_entries, entry, index); + gtk_widget_show (m_container); } -private: -std::list <Ypp::Package *> m_selection; + virtual void entryDeleted (Ypp::Pool::Iter iter, Ypp::Package *package) + { + int index = m_pool->getIndex (iter); + GList *i = g_list_nth (m_entries, index); + Entry *entry = (Entry *) i->data; + gtk_container_remove (GTK_CONTAINER (m_entries_box), entry->getWidget()); + delete entry; + m_entries = g_list_delete_link (m_entries, i); + if (m_entries == NULL) + gtk_widget_hide (m_container); + } - virtual void packagesSelected (const std::list <Ypp::Package *> &selection) + virtual void entryChanged (Ypp::Pool::Iter iter, Ypp::Package *package) { - gtk_widget_set_sensitive (m_undo_button, !selection.empty()); - m_selection = selection; + int index = m_pool->getIndex (iter); + Entry *entry = (Entry *) g_list_nth_data (m_entries, index); + entry->modified (package); } - static void undo_clicked_cb (GtkButton *button, TrashWindow *pThis) + static void style_set_cb (GtkWidget *widget, GtkStyle *prev_style) { - for (std::list <Ypp::Package *>::iterator it = pThis->m_selection.begin(); - it != pThis->m_selection.end(); it++) - (*it)->undo(); + static bool set_style = false; + if (set_style) + return; + set_style = true; + GdkColor *color = &widget->style->bg [GTK_STATE_SELECTED]; + gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, color); + set_style = false; } }; -#include "icons/cat-development.xpm" -#include "icons/cat-documentation.xpm" -#include "icons/cat-emulators.xpm" -#include "icons/cat-games.xpm" -#include "icons/cat-hardware.xpm" -#include "icons/cat-network.xpm" -#include "icons/cat-multimedia.xpm" -#include "icons/cat-office.xpm" -#include "icons/cat-system.xpm" -#include "icons/cat-utilities.xpm" +// Maps icons to top package groups +struct CategoriesIconMap { + const char *category, *icon; +}; +static const CategoriesIconMap catIconMap[] = { + { "Amusements", "package_games" }, + { "Games", "package_games" }, + { "Development", "package_development" }, + { "Libraries", "package_development" }, + { "Documentation", "package_documentation" }, + { "Hardware", "package_settings_peripherals" }, + { "Applications", "package_applications" }, + { "Productivity", "package_applications" }, + { "System", "package_system" }, + { "X11", "package_system" }, + { "Multimedia", "package_multimedia" }, + { "Video", "package_multimedia" }, + { "Office", "package_office_documentviewer" }, +}; +#define CAT_SIZE (sizeof (catIconMap)/sizeof (CategoriesIconMap)) + +#include "icons/pkg-installed.xpm" +#include "icons/pkg-installed-upgradable.xpm" +#include "icons/pkg-available.xpm" class Filters { + class Collections + { + struct View + { + virtual GtkWidget *getWidget() = 0; + virtual void writeQuery (Ypp::Query *query) = 0; + + Filters *m_filters; + View (Filters *filters) + : m_filters (filters) + {} + }; + + struct Categories : public View + { + GtkWidget *m_scroll, *m_view; + public: + virtual GtkWidget *getWidget() + { return m_scroll; } + + Categories (Filters *filters, Ypp::Package::Type type) + : View (filters) + { + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + + m_view = gtk_tree_view_new(); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (m_view), FALSE); + gtk_tree_view_set_search_column (GTK_TREE_VIEW (m_view), 0); + renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes ("", + renderer, "pixbuf", 2, NULL); + gtk_tree_view_column_set_expand (column, FALSE); + gtk_tree_view_append_column (GTK_TREE_VIEW (m_view), column); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes ("", + renderer, "text", 0, NULL); + gtk_tree_view_column_set_expand (column, TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW (m_view), column); + if (type == Ypp::Package::PATCH_TYPE) + gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (m_view), FALSE); + else + gtk_tree_view_set_expander_column (GTK_TREE_VIEW (m_view), column); + + GtkTreeSelection *selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (m_view)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (selection_cb), this); + + m_scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (m_scroll), + GTK_SHADOW_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_set_size_request (m_scroll, -1, 200); + gtk_container_add (GTK_CONTAINER (m_scroll), m_view); + + build (type); + } + + void build (Ypp::Package::Type type) + { + GtkTreeModel *model = NULL; + + struct inner { + static void populate (GtkTreeStore *store, GtkTreeIter *parent, + Ypp::Node *category) + { + if (!category) + return; + GtkTreeIter iter; + gtk_tree_store_append (store, &iter, parent); + const std::string &name = category->name; + gtk_tree_store_set (store, &iter, 0, name.c_str(), 1, category, -1); + if (!parent) { + const gchar *icon = 0; + for (unsigned int i = 0; i < CAT_SIZE; i++) + if (name == catIconMap[i].category) { + icon = catIconMap[i].icon; + break; + } + if (icon) { + GtkIconTheme *icons = gtk_icon_theme_get_default(); + GdkPixbuf *pixbuf; + pixbuf = gtk_icon_theme_load_icon (icons, icon, 22, + GtkIconLookupFlags (0), NULL); + gtk_tree_store_set (store, &iter, 2, pixbuf, -1); + } + } + populate (store, &iter, category->child()); + populate (store, parent, category->next()); + } + }; + + GtkTreeStore *store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, + GDK_TYPE_PIXBUF); + model = GTK_TREE_MODEL (store); + + GtkTreeIter iter; + gtk_tree_store_append (store, &iter, NULL); + gtk_tree_store_set (store, &iter, 0, _("All"), 1, NULL, -1); + + inner::populate (store, NULL, Ypp::get()->getFirstCategory (type)); + + GtkTreeSelection *selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (m_view)); + g_signal_handlers_block_by_func (selection, (gpointer) selection_cb, this); + + gtk_tree_view_set_model (GTK_TREE_VIEW (m_view), model); + if (model) { + g_object_unref (G_OBJECT (model)); + + /* we use gtk_tree_view_set_cursor(), rather than gtk_tree_selection_select_iter() + because that one is buggy in that when the user first interacts with the treeview, + a change signal is sent, even if he was just expanding one node... */ + GtkTreePath *path = gtk_tree_path_new_first(); + gtk_tree_view_set_cursor (GTK_TREE_VIEW (m_view), path, NULL, FALSE); + gtk_tree_path_free (path); + } + + g_signal_handlers_unblock_by_func (selection, (gpointer) selection_cb, this); + } + + Ypp::Node *getActive() + { + GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (m_view)); + GtkTreeModel *model; + GtkTreeIter iter; + Ypp::Node *category = 0; + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + gtk_tree_model_get (model, &iter, 1, &category, -1); + return category; + } + + static void selection_cb (GtkTreeSelection *selection, View *pThis) + { + pThis->m_filters->signalChanged(); + } + + virtual void writeQuery (Ypp::Query *query) + { + Ypp::Node *node = getActive(); + if (node) + query->setCategory (node); + } + }; + + struct Pool : public View, public PackagesView::Listener + { + PackagesView *m_view; + GtkWidget *m_box, *m_buttons_box; + public: + virtual GtkWidget *getWidget() + { return m_box; } + + Pool (Filters *filters, Ypp::Package::Type type) + : View (filters) + { + m_view = new PackagesView(); + Ypp::Query *query = new Ypp::Query(); + query->setType (type); + m_view->setQuery (query); + m_view->setListener (this); + + m_buttons_box = gtk_hbox_new (TRUE, 2); + GtkWidget *image, *button; + button = gtk_button_new_with_label (_("Install All")); + image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (install_cb), this); + gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0); + button = gtk_button_new_with_label (_("Remove All")); + image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (remove_cb), this); + gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0); + gtk_widget_set_sensitive (m_buttons_box, FALSE); + + m_box = gtk_vbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (m_box), m_view->getWidget(), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (m_box), m_buttons_box, FALSE, TRUE, 0); + } + + std::list <Ypp::Package *> m_selected; + + virtual void packagesSelected (const std::list <Ypp::Package *> &selection) + { + gtk_widget_set_sensitive (m_buttons_box, !selection.empty()); + m_selected = selection; + m_filters->signalChanged(); + } + + virtual void writeQuery (Ypp::Query *query) + { + if (!m_selected.empty()) + query->setCollection (m_selected.front()); + } + + void doAll (bool install /*or remove*/) + { + // we just need to mark the collections themselves + for (std::list <Ypp::Package *>::iterator it = m_selected.begin(); + it != m_selected.end(); it++) + install ? (*it)->install(0) : (*it)->remove(); + } + + static void install_cb (GtkButton *button, Pool *pThis) + { pThis->doAll (true); } + static void remove_cb (GtkButton *button, Pool *pThis) + { pThis->doAll (false); } + }; + + View *m_view; + GtkWidget *m_bin; + Filters *m_filters; + + public: + Collections (Filters *filters) + : m_view (NULL), m_filters (filters) + { + m_bin = gtk_event_box_new(); + } + + ~Collections() + { + delete m_view; + } + + GtkWidget *getWidget() + { return m_bin; } + + void setType (Ypp::Package::Type type) + { + if (m_view) + gtk_container_remove (GTK_CONTAINER (m_bin), m_view->getWidget()); + delete m_view; + + switch (type) + { + case Ypp::Package::PACKAGE_TYPE: + case Ypp::Package::PATCH_TYPE: + m_view = new Categories (m_filters, type); + break; + case Ypp::Package::PATTERN_TYPE: + case Ypp::Package::LANGUAGE_TYPE: + m_view = new Pool (m_filters, type); + break; + default: + m_view = NULL; + break; + } + + if (m_view) { + gtk_widget_show_all (m_view->getWidget()); + gtk_container_add (GTK_CONTAINER (m_bin), m_view->getWidget()); + } + } + + void writeQuery (Ypp::Query *query) + { + if (m_view) + m_view->writeQuery (query); + } + }; + + class StatusButtons + { + GtkWidget *m_box; + Filters *m_filters; + int m_selectedStatus; + + public: + GtkWidget *getWidget() + { return m_box; } + + StatusButtons (Filters *filters) + : m_filters (filters), m_selectedStatus (0) + { + m_box = gtk_hbox_new (FALSE, 6); + GtkWidget *homo_box = gtk_hbox_new (TRUE, 6); // same size box + gtk_box_pack_start (GTK_BOX (m_box), homo_box, TRUE, TRUE, 0); + + GtkWidget *button; + GSList *group; + button = createButton ("Available", pkg_available_xpm, NULL); + group = ygtk_toggle_button_get_group (YGTK_TOGGLE_BUTTON (button)); + gtk_box_pack_start (GTK_BOX (homo_box), button, TRUE, TRUE, 0); + button = createButton ("Upgrades", pkg_installed_upgradable_xpm, group); + gtk_box_pack_start (GTK_BOX (homo_box), button, TRUE, TRUE, 0); + button = createButton ("Installed", pkg_installed_xpm, group); + gtk_box_pack_start (GTK_BOX (homo_box), button, TRUE, TRUE, 0); + button = createButton ("All", 0, group); + gtk_box_pack_start (GTK_BOX (m_box), button, FALSE, TRUE, 0); + } + + int getActive() + { + return m_selectedStatus; + } + + GtkWidget *createButton (const char *label, const char **xpm, GSList *group) + { + GtkWidget *button = ygtk_toggle_button_new (group); + GtkWidget *hbox = gtk_hbox_new (FALSE, 0); + if (xpm) + gtk_box_pack_start (GTK_BOX (hbox), createImageFromXPM (xpm), FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (label), TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (button), hbox); + if (!group) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); + g_signal_connect (G_OBJECT (button), "toggle-changed", + G_CALLBACK (status_toggled_cb), this); + return button; + } + + static void status_toggled_cb (GtkToggleButton *toggle, gint nb, StatusButtons *pThis) + { + pThis->m_selectedStatus = nb; + pThis->m_filters->signalChanged(); + } + }; + public: struct Listener { virtual void doQuery (Ypp::Query *query) = 0; @@ -351,65 +796,69 @@ { m_listener = listener; signalChanged(); } private: - GtkWidget *m_widget, *m_name, *m_status, *m_categories, *m_repos, *m_type, - *m_categories_expander, *m_repos_expander; + Collections *m_collection; + StatusButtons *m_statuses; + GtkWidget *m_name, *m_repos, *m_type; Listener *m_listener; guint timeout_id; - int repoToggled; // how many repos are toggled? if 0, it can speed up query - int packageType; + int m_selectedType; public: - GtkWidget *getWidget() - { return m_widget; } + GtkWidget *getCollectionWidget() { return m_collection->getWidget(); } + GtkWidget *getStatusesWidget() { return m_statuses->getWidget(); } + GtkWidget *getNameWidget() { return m_name; } + GtkWidget *getReposWidget() { return m_repos; } + GtkWidget *getTypeWidget() { return m_type; } - Filters() - : m_listener (NULL), timeout_id (0), repoToggled (0), packageType (-1) + Filters (bool update_mode) + : m_listener (NULL), timeout_id (0), m_selectedType (-1) { - GtkWidget *vbox = gtk_vbox_new (FALSE, 4); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); - GtkSizeGroup *size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + m_collection = new Collections (this); + m_statuses = new StatusButtons (this); m_name = ygtk_find_entry_new(); - g_signal_connect_after (G_OBJECT (m_name), "changed", - G_CALLBACK (entry_changed_cb), this); - gtk_box_pack_start (GTK_BOX (vbox), - labelWidget (_("Name: "), m_name, size_group), FALSE, TRUE, 0); - - m_status = gtk_combo_box_new_text(); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_status), _("All")); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_status), _("Installed")); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_status), _("Upgradable")); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_status), _("Available")); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_status), _("Modified")); - gtk_combo_box_set_active (GTK_COMBO_BOX (m_status), 0); - g_signal_connect_after (G_OBJECT (m_status), "changed", - G_CALLBACK (combo_changed_cb), this); - gtk_box_pack_start (GTK_BOX (vbox), - labelWidget (_("Status: "), m_status, size_group), FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), buildCategories(), FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), buildRepos(), FALSE, TRUE, 0); + gtk_widget_set_tooltip_markup (m_name, + _("<b>Package search:</b> Use spaces to separate your keywords. They " + "will be matched against RPM <i>name</i>, <i>summary</i> and " + "<i>provides</i> attributes.\n(e.g.: \"yast dhcp\" will return yast's " + "dhcpd tool)")); + g_signal_connect (G_OBJECT (m_name), "changed", + G_CALLBACK (entry_changed_cb), this); + + m_repos = gtk_combo_box_new_text(); + gtk_widget_set_tooltip_markup (m_repos, + _("<b>Package repositories:</b> Limits the query to one repository.\n" + "Repositories may be added or managed through YaST control center.")); + gtk_combo_box_append_text (GTK_COMBO_BOX (m_repos), _("All Repositories")); + for (int i = 0; Ypp::get()->getRepository (i); i++) { + const Ypp::Repository *repo = Ypp::get()->getRepository (i); + gtk_combo_box_append_text (GTK_COMBO_BOX (m_repos), repo->name.c_str()); + } + gtk_combo_box_set_active (GTK_COMBO_BOX (m_repos), 0); + g_signal_connect (G_OBJECT (m_repos), "changed", + G_CALLBACK (combo_changed_cb), this); m_type = gtk_combo_box_new_text(); - gtk_combo_box_append_text (GTK_COMBO_BOX (m_type), _("Packages")); + gtk_combo_box_append_text (GTK_COMBO_BOX (m_type), _("Categories")); gtk_combo_box_append_text (GTK_COMBO_BOX (m_type), _("Patterns")); gtk_combo_box_append_text (GTK_COMBO_BOX (m_type), _("Languages")); - gtk_combo_box_set_active (GTK_COMBO_BOX (m_type), 0); + gtk_combo_box_append_text (GTK_COMBO_BOX (m_type), _("Patches")); + gtk_combo_box_set_active (GTK_COMBO_BOX (m_type), update_mode ? 3 : 0); g_signal_connect_after (G_OBJECT (m_type), "changed", G_CALLBACK (combo_changed_cb), this); - gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new (""), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), - labelWidget (_("Type: "), m_type, size_group), FALSE, TRUE, 0); - - m_widget = gtk_notebook_new(); - gtk_notebook_append_page (GTK_NOTEBOOK (m_widget), vbox, - gtk_label_new (_("Filters"))); - g_object_unref (G_OBJECT (size_group)); } ~Filters() { - if (timeout_id) g_source_remove (timeout_id); + if (timeout_id) + g_source_remove (timeout_id); + } + +public: + int selectedRepo() + { + int repo = gtk_combo_box_get_active (GTK_COMBO_BOX (m_repos))-1; + return repo; } private: @@ -422,61 +871,43 @@ { if (!m_listener) return; - Ypp::Package::Type type; - switch (gtk_combo_box_get_active (GTK_COMBO_BOX (m_type))) - { - case 0: default: type = Ypp::Package::PACKAGE_TYPE; break; - case 1: type = Ypp::Package::PATTERN_TYPE; break; - case 2: type = Ypp::Package::LANGUAGE_TYPE; break; - + Ypp::Package::Type type = (Ypp::Package::Type) + gtk_combo_box_get_active (GTK_COMBO_BOX (m_type)); + + // adjust interface + if (type != m_selectedType) { + m_collection->setType (type); + m_selectedType = type; } - Ypp::Query *query = new Ypp::Query (type); + // create query + Ypp::Query *query = new Ypp::Query(); + if (type == Ypp::Package::PATCH_TYPE) + query->setType (Ypp::Package::PATCH_TYPE); + else + query->setType (Ypp::Package::PACKAGE_TYPE); const char *name = gtk_entry_get_text (GTK_ENTRY (m_name)); if (*name) query->setName (std::string (name)); - switch (gtk_combo_box_get_active (GTK_COMBO_BOX (m_status))) - { - case 1: query->setIsInstalled (true); break; - case 2: query->setHasUpgrade (true); break; - case 3: query->setIsInstalled (false); break; - case 4: query->setIsModified (true); break; - case 0: default: break; - - } + switch (m_statuses->getActive()) { - GtkTreeSelection *selection = gtk_tree_view_get_selection ( - GTK_TREE_VIEW (m_categories)); - GtkTreeModel *model; - GtkTreeIter iter; - if (gtk_tree_selection_get_selected (selection, &model, &iter)) { - Ypp::Node *category; - gtk_tree_model_get (model, &iter, 1, &category, -1); - if (category) - query->setCategory (category); - } + case 0: query->setIsInstalled (false); break; + case 1: query->setHasUpgrade (true); break; + case 2: query->setIsInstalled (true); break; + case 3: default: break; } - if (repoToggled) { + m_collection->writeQuery (query); + + if (selectedRepo() >= 0) { std::list <int> reposQuery; - GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (m_repos)); - GtkTreeIter iter; - if (gtk_tree_model_get_iter_first (model, &iter)) { - do { - gboolean enabled; - gint repo; - gtk_tree_model_get (model, &iter, 0, &enabled, 2, &repo, -1); - if (enabled) - reposQuery.push_back (repo); - } while (gtk_tree_model_iter_next (model, &iter)); - } + reposQuery.push_back (selectedRepo()); query->setRepositories (reposQuery); } m_listener->doQuery (query); - updateCategories (type); } void signalChangedDelay() @@ -491,245 +922,7 @@ } }; if (timeout_id) g_source_remove (timeout_id); - timeout_id = g_timeout_add (500, inner::timeout_cb, this); - } - - void updateCategories (Ypp::Package::Type type) - { - if (packageType == type) - return; - packageType = type; - - GtkTreeModel *model = NULL; - - if (type == Ypp::Package::PACKAGE_TYPE) { - struct inner { - static void populate (GtkTreeStore *store, GtkTreeIter *parent, - Ypp::Node *category) - { - if (!category) - return; - GtkTreeIter iter; - gtk_tree_store_append (store, &iter, parent); - const std::string &name = category->name; - gtk_tree_store_set (store, &iter, 0, name.c_str(), 1, category, -1); - if (!parent) { - const char **icon = 0; - if (name == "Development") - icon = cat_development_xpm; - else if (name == "Documentation") - icon = cat_documentation_xpm; - else if (name == "Emulators") - icon = cat_emulators_xpm; - else if (name == "Games") - icon = cat_games_xpm; - else if (name == "Hardware") - icon = cat_hardware_xpm; - else if (name == "Multimedia") - icon = cat_multimedia_xpm; - else if (name == "Network") - icon = cat_network_xpm; - else if (name == "Office") - icon = cat_office_xpm; - else if (name == "System") - icon = cat_system_xpm; - else if (name == "Utilities") - icon = cat_utilities_xpm; - if (icon) { - GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data (icon); - gtk_tree_store_set (store, &iter, 2, pixbuf, -1); - } - } - populate (store, &iter, category->child()); - populate (store, parent, category->next()); - } - }; - - GtkTreeStore *store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, - GDK_TYPE_PIXBUF); - model = GTK_TREE_MODEL (store); - - GtkTreeIter iter; - gtk_tree_store_append (store, &iter, NULL); - gtk_tree_store_set (store, &iter, 0, _("All"), 1, NULL, -1); - - inner::populate (store, NULL, Ypp::get()->getFirstCategory (type)); - - } - else if (type == Ypp::Package::PATTERN_TYPE) { - GtkListStore *store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, - GDK_TYPE_PIXBUF); - model = GTK_TREE_MODEL (store); - - GtkTreeIter iter; - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, _("All"), 1, NULL, -1); - - for (Ypp::Node *i = Ypp::get()->getFirstCategory (type); i; i = i->next()) { - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, i->name.c_str(), 1, i, -1); - } - } - - GtkTreeSelection *selection = gtk_tree_view_get_selection ( - GTK_TREE_VIEW (m_categories)); - g_signal_handlers_block_by_func (selection, - (gpointer) categories_selection_cb, this); - - gtk_tree_view_set_model (GTK_TREE_VIEW (m_categories), model); - if (model) { - g_object_unref (G_OBJECT (model)); - gtk_widget_show (m_categories_expander); - - /* we use gtk_tree_view_set_cursor(), rather than gtk_tree_selection_select_iter() - because that one is buggy in that when the user first interacts with the treeview, - a change signal is sent, even if he was just expanding one node... */ - GtkTreePath *path = gtk_tree_path_new_first(); - gtk_tree_view_set_cursor (GTK_TREE_VIEW (m_categories), path, NULL, FALSE); - gtk_tree_path_free (path); - } - else - gtk_widget_hide (m_categories_expander); - - g_signal_handlers_unblock_by_func (selection, - (gpointer) categories_selection_cb, this); - } - - GtkWidget *buildCategories() - { - GtkWidget *scroll; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - m_categories = gtk_tree_view_new(); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (m_categories), FALSE); - gtk_tree_view_set_search_column (GTK_TREE_VIEW (m_categories), 0); - renderer = gtk_cell_renderer_pixbuf_new(); - column = gtk_tree_view_column_new_with_attributes ("", - renderer, "pixbuf", 2, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (m_categories), column); - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes ("", - renderer, "text", 0, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (m_categories), column); - - GtkTreeSelection *selection = gtk_tree_view_get_selection ( - GTK_TREE_VIEW (m_categories)); - gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); - g_signal_connect (G_OBJECT (selection), "changed", - G_CALLBACK (categories_selection_cb), this); - - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_widget_set_size_request (scroll, -1, 200); - gtk_container_add (GTK_CONTAINER (scroll), m_categories); - - m_categories_expander = gtk_expander_new (_("Categories")); - gtk_container_add (GTK_CONTAINER (m_categories_expander), scroll); - gtk_expander_set_expanded (GTK_EXPANDER (m_categories_expander), TRUE); - return m_categories_expander; - } - - GtkWidget *buildRepos() - { - GtkWidget *scroll; - GtkListStore *store; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - // 0 - enabled, 1 - name, 2 - ptr - store = gtk_list_store_new (3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_INT); - for (int i = 0; Ypp::get()->getRepository (i); i++) { - const Ypp::Repository *repo = Ypp::get()->getRepository (i); - GtkTreeIter iter; - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, TRUE, 1, repo->name.c_str(), 2, i, -1); - } - m_repos = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (m_repos), FALSE); - gtk_tree_view_set_search_column (GTK_TREE_VIEW (m_repos), 1); - gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (m_repos)), - GTK_SELECTION_NONE); - g_object_unref (G_OBJECT (store)); - renderer = gtk_cell_renderer_toggle_new(); - column = gtk_tree_view_column_new_with_attributes ("", renderer, "active", 0, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (m_repos), column); - g_signal_connect (G_OBJECT (renderer), "toggled", - G_CALLBACK (repo_toggled_cb), this); - g_signal_connect (G_OBJECT (m_repos), "row-activated", - G_CALLBACK (repo_clicked_cb), this); - renderer = gtk_cell_renderer_text_new(); - g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - column = gtk_tree_view_column_new_with_attributes ("", - renderer, "text", 1, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (m_repos), column); - - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), - GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_widget_set_size_request (scroll, -1, 80); - gtk_container_add (GTK_CONTAINER (scroll), m_repos); - - m_repos_expander = gtk_expander_new (_("Repositories")); - gtk_container_add (GTK_CONTAINER (m_repos_expander), scroll); - return m_repos_expander; - } - - static void categories_selection_cb (GtkTreeSelection *selection, Filters *pThis) - { -fprintf (stderr, "CATEGORIES SELECTED\n"); - pThis->signalChanged(); - } - - void toggle_repo (GtkTreePath *path) - { - IMPL - GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (m_repos)); - GtkListStore *store = GTK_LIST_STORE (model); - GtkTreeIter iter; - gtk_tree_model_get_iter (model, &iter, path); - - gboolean enabled; - gtk_tree_model_get (model, &iter, 0, &enabled, -1); - gtk_list_store_set (store, &iter, 0, !enabled, -1); - if (enabled) repoToggled--; else repoToggled++; -fprintf (stderr, "repoToggled count: %d\n", repoToggled); - signalChanged(); - } - - static void repo_toggled_cb (GtkCellRendererToggle *renderer, - gchar *path_str, Filters *pThis) - { - IMPL - GtkTreePath *path = gtk_tree_path_new_from_string (path_str); - pThis->toggle_repo (path); - gtk_tree_path_free (path); - } - - static void repo_clicked_cb (GtkTreeView *view, GtkTreePath *path, - GtkTreeViewColumn *column, Filters *pThis) - { - IMPL - pThis->toggle_repo (path); - } - - // utility - static GtkWidget *labelWidget (const char *label_str, GtkWidget *widget, - GtkSizeGroup *group) - { - GtkWidget *hbox = gtk_hbox_new (FALSE, 0); - GtkWidget *label = gtk_label_new_with_mnemonic (label_str); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); - gtk_size_group_add_widget (group, label); - return hbox; + timeout_id = g_timeout_add (250, inner::timeout_cb, this); } }; @@ -738,92 +931,97 @@ class PackageControl { -GtkWidget *m_vbox, *m_status, *m_lock_button, *m_locked_image, *m_unlocked_image, - *m_installed_box, *m_available_box, *m_remove_button, *m_install_button, - *m_undo_button, *m_versions_combo, *m_version_repo; -GtkTreeModel *m_versions_model; +GtkWidget *m_widget, *m_install_button, *m_remove_button, *m_installed_version, + *m_available_versions, *m_undo_button, *m_lock_button, *m_locked_image, + *m_unlocked_image, *m_package_image; public: -std::list <Ypp::Package *> m_packages; +std::list <Ypp::Package *> m_packages; // we keep a copy to test against modified... +Filters *m_filters; // used to filter repo versions... GtkWidget *getWidget() - { return m_vbox; } + { return m_widget; } - PackageControl() + PackageControl (Filters *filters) + : m_filters (filters) { - GtkSizeGroup *size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - m_vbox = gtk_vbox_new (FALSE, 6); - GtkWidget *hbox, *label; + // installed + m_install_button = createButton ("", GTK_STOCK_SAVE); + g_signal_connect (G_OBJECT (m_install_button), "clicked", + G_CALLBACK (install_clicked_cb), this); + + m_installed_version = gtk_label_new (""); + gtk_misc_set_alignment (GTK_MISC (m_installed_version), 0, 0.5); + // available + m_remove_button = createButton (_("_Remove"), GTK_STOCK_DELETE); + g_signal_connect (G_OBJECT (m_remove_button), "clicked", + G_CALLBACK (remove_clicked_cb), this); + + m_available_versions = gtk_combo_box_new_text(); + g_signal_connect (G_OBJECT (m_available_versions), "changed", + G_CALLBACK (version_changed_cb), this); + + // lock m_lock_button = gtk_toggle_button_new(); + gtk_widget_set_tooltip_markup (m_lock_button, + _("<b>Package lock:</b> prevents the package status from being modified by " + "the solver (that is, it won't honour dependencies or collections ties.)")); g_signal_connect (G_OBJECT (m_lock_button), "toggled", G_CALLBACK (locked_toggled_cb), this); - m_undo_button = gtk_button_new_from_stock (GTK_STOCK_UNDO); - g_signal_connect (G_OBJECT (m_undo_button), "clicked", - G_CALLBACK (undo_clicked_cb), this); - - hbox = gtk_hbox_new (FALSE, 6); - label = gtk_label_new (_("Status:")); - YGUtils::setWidgetFont (label, PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_size_group_add_widget (size_group, label); - m_status = gtk_label_new ("-"); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), m_status, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), m_undo_button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new(0), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), m_lock_button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_vbox), hbox, TRUE, TRUE, 0); - m_locked_image = createImageFromXPM (pkg_locked_xpm); m_unlocked_image = createImageFromXPM (pkg_unlocked_xpm); g_object_ref_sink (G_OBJECT (m_locked_image)); g_object_ref_sink (G_OBJECT (m_unlocked_image)); - m_remove_button = createButton (_("_Remove"), GTK_STOCK_DELETE); - g_signal_connect (G_OBJECT (m_remove_button), "clicked", - G_CALLBACK (remove_clicked_cb), this); - m_install_button = createButton ("", GTK_STOCK_SAVE); - g_signal_connect (G_OBJECT (m_install_button), "clicked", - G_CALLBACK (install_clicked_cb), this); + m_package_image = gtk_image_new(); - m_installed_box = gtk_hbox_new (FALSE, 6); + m_undo_button = gtk_button_new_from_stock (GTK_STOCK_UNDO); + g_signal_connect (G_OBJECT (m_undo_button), "clicked", + G_CALLBACK (undo_clicked_cb), this); + + // layout + GtkWidget *table; + table = gtk_table_new (3, 2, FALSE); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + // versions + gtk_table_attach (GTK_TABLE (table), m_installed_version, 1, 2, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (GTK_TABLE (table), m_available_versions, 1, 2, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + // buttons + gtk_table_attach (GTK_TABLE (table), m_remove_button, 2, 3, 0, 1, + GTK_FILL, GtkAttachOptions (0), 0, 0); + gtk_table_attach (GTK_TABLE (table), m_install_button, 2, 3, 1, 2, + GTK_FILL, GtkAttachOptions (0), 0, 0); + // labels + GtkWidget *label; label = gtk_label_new (_("Installed: ")); YGUtils::setWidgetFont (label, PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_size_group_add_widget (size_group, label); - gtk_box_pack_start (GTK_BOX (m_installed_box), label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_installed_box), m_remove_button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_vbox), m_installed_box, TRUE, TRUE, 0); - - m_versions_model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT)); - m_versions_combo = gtk_combo_box_new_with_model (m_versions_model); - g_signal_connect (G_OBJECT (m_versions_combo), "changed", - G_CALLBACK (version_changed_cb), this); - - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (m_versions_combo), renderer, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (m_versions_combo), - renderer, "text", 0, NULL); - - m_available_box = gtk_hbox_new (FALSE, 6); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); label = gtk_label_new (_("Available: ")); YGUtils::setWidgetFont (label, PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_size_group_add_widget (size_group, label); - gtk_box_pack_start (GTK_BOX (m_available_box), label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_available_box), m_versions_combo, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_available_box), m_install_button, FALSE, TRUE, 0); - label = gtk_label_new (_("(Repository:")); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - m_version_repo = gtk_label_new (""); - gtk_misc_set_alignment (GTK_MISC (m_version_repo), 0, 0.5); - gtk_label_set_ellipsize (GTK_LABEL (m_version_repo), PANGO_ELLIPSIZE_END); - gtk_box_pack_start (GTK_BOX (m_available_box), label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_available_box), m_version_repo, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (m_vbox), m_available_box, TRUE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); - g_object_unref (G_OBJECT (size_group)); + GtkWidget *lock_align = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (lock_align), m_lock_button); + + GtkWidget *undo_align = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (undo_align), m_undo_button); + + GtkWidget *hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), undo_align, FALSE, TRUE, 12); + gtk_box_pack_start (GTK_BOX (hbox), lock_align, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new(""), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), m_package_image, FALSE, TRUE, 0); + + m_widget = gtk_alignment_new (0, 0.5, 1, 0); + gtk_container_set_border_width (GTK_CONTAINER (m_widget), 6); + gtk_container_add (GTK_CONTAINER (m_widget), hbox); } ~PackageControl() @@ -836,171 +1034,118 @@ void setPackages (const std::list <Ypp::Package *> &packages) { -fprintf (stderr, "packages selected (%d)\n", packages.size()); - // FIXME: we'll probably want to re-work the controls interface - // for now, let's just handle none-one-multiple selections separatadely m_packages = packages; - if (packages.size() == 1) { - Ypp::Package *package = packages.front(); - // status label - std::string status; - if (package->isInstalled()) - status = _("Installed ") + package->getInstalledVersion()->number; - else - status = _("Not installed"); - if (package->toInstall()) { - int nb; - const Ypp::Package::Version *version; - package->toInstall (&nb); - version = package->getAvailableVersion (nb); - status += _(" (to install"); - if (version) - status += " " + version->number; - status += ")"; - } - else if (package->toRemove()) - status += _(" (to remove)"); - gtk_label_set_text (GTK_LABEL (m_status), status.c_str()); - if (package->isModified()) - gtk_widget_show (m_undo_button); - else - gtk_widget_hide (m_undo_button); - - // install version - if (package->isInstalled()) - gtk_widget_show (m_installed_box); - else - gtk_widget_hide (m_installed_box); + if (packages.empty()) + return; + Ypp::Package *single_package = packages.size() == 1 ? packages.front() : NULL; - // available versions - gtk_widget_show (m_versions_combo); - if (package->getAvailableVersion (0)) { - gtk_list_store_clear (GTK_LIST_STORE (m_versions_model)); - for (int i = 0; package->getAvailableVersion (i); i++) { - const char *version = package->getAvailableVersion (i)->number.c_str(); -fprintf (stderr, "adding version: %s\n", version); - GtkTreeIter iter; - gtk_list_store_append (GTK_LIST_STORE (m_versions_model), &iter); - gtk_list_store_set (GTK_LIST_STORE (m_versions_model), &iter, - 0, version, 1, i, -1); - } - gtk_combo_box_set_active (GTK_COMBO_BOX (m_versions_combo), 0); - gtk_widget_show (m_available_box); + bool allInstalled = true, allNotInstalled = true, allUpgradable = true, + allModified = true, allLocked = true, allUnlocked = true; + for (std::list <Ypp::Package *>::const_iterator it = packages.begin(); + it != packages.end(); it++) { + if (!(*it)->isInstalled()) { + allInstalled = false; + allUpgradable = false; + } + else { + allNotInstalled = false; + const Ypp::Package::Version *version = (*it)->getAvailableVersion(0); + if (!version || version->cmp <= 0) + allUpgradable = false; + } + if ((*it)->isModified()) { + // if modified, can't be locked or unlocked + allLocked = allUnlocked = false; } else - gtk_widget_hide (m_available_box); - - // is locked - gtk_widget_show (m_lock_button); - bool locked = package->isLocked(); - g_signal_handlers_block_by_func (m_lock_button, (gpointer) locked_toggled_cb, this); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_lock_button), locked); - g_signal_handlers_unblock_by_func (m_lock_button, (gpointer) locked_toggled_cb, this); - gtk_button_set_image (GTK_BUTTON (m_lock_button), - locked ? m_locked_image : m_unlocked_image); - gtk_widget_set_sensitive (m_install_button, !locked); - gtk_widget_set_sensitive (m_remove_button, !locked); - - gtk_widget_show (m_vbox); - } - else if (packages.size()) { - bool allInstalled = true, allNotInstalled = true, allUpgradable = true, - allModified = true, allLocked = true, allUnlocked = true; - for (std::list <Ypp::Package *>::const_iterator it = packages.begin(); - it != packages.end(); it++) { - if (!(*it)->isInstalled()) { - allInstalled = false; - allUpgradable = false; - } - else { - allNotInstalled = false; - const Ypp::Package::Version *version = (*it)->getAvailableVersion(0); - if (!version || version->cmp <= 0) - allUpgradable = false; - } - if (!(*it)->isModified()) - allModified = false; - if ((*it)->isLocked()) - allUnlocked = false; - else - allLocked = false; - } - - std::string status; - if (allInstalled) - status = _("Installed"); - else if (allNotInstalled) - status = _("Not installed"); + allModified = false; + if ((*it)->isLocked()) + allUnlocked = false; else - status = _("--"); + allLocked = false; + } - if (allModified) { - status += _(" (modified)"); - gtk_widget_show (m_undo_button); - } + if (allInstalled) { + gtk_widget_show (m_remove_button); + if (single_package) + gtk_label_set_text (GTK_LABEL (m_installed_version), + single_package->getInstalledVersion()->number.c_str()); else - gtk_widget_hide (m_undo_button); - gtk_label_set_text (GTK_LABEL (m_status), status.c_str()); + gtk_label_set_text (GTK_LABEL (m_installed_version), "(several)"); + } + else { + gtk_widget_hide (m_remove_button); + gtk_label_set_text (GTK_LABEL (m_installed_version), "--"); + } - // install version - if (allInstalled) - gtk_widget_show (m_installed_box); + GtkTreeModel *model = gtk_combo_box_get_model ( + GTK_COMBO_BOX (m_available_versions)); + gtk_list_store_clear (GTK_LIST_STORE (model)); + gtk_widget_set_sensitive (m_available_versions, FALSE); + gtk_widget_show (m_install_button); + if (single_package) { + if (single_package->getAvailableVersion (0)) { + gtk_widget_set_sensitive (m_available_versions, TRUE); + gtk_widget_show (m_install_button); + int selectedRepo = m_filters->selectedRepo(); + for (int i = 0; single_package->getAvailableVersion (i); i++) { + const Ypp::Package::Version *version = single_package->getAvailableVersion (i); + if (selectedRepo >= 0 && version->repo != selectedRepo) + continue; + string text = version->number + "\n"; + text += "(" + Ypp::get()->getRepository (version->repo)->name + ")"; + gtk_combo_box_append_text (GTK_COMBO_BOX (m_available_versions), text.c_str()); + } + gtk_combo_box_set_active (GTK_COMBO_BOX (m_available_versions), 0); + } else - gtk_widget_hide (m_installed_box); - - // available versions - gtk_widget_hide (m_versions_combo); - if (allNotInstalled || allUpgradable) { - gtk_widget_show (m_available_box); - const char *installLabel = _("Install"); - if (allUpgradable) - installLabel = _("Upgrade"); - gtk_button_set_label (GTK_BUTTON (m_install_button), installLabel); + gtk_widget_hide (m_install_button); + } + else { + if (allUpgradable) { + gtk_combo_box_append_text (GTK_COMBO_BOX (m_available_versions), "(upgrades)"); + gtk_combo_box_set_active (GTK_COMBO_BOX (m_available_versions), 0); + gtk_button_set_label (GTK_BUTTON (m_install_button), _("Upgrade")); + } + else if (allNotInstalled) { + gtk_combo_box_append_text (GTK_COMBO_BOX (m_available_versions), "(several)"); + gtk_combo_box_set_active (GTK_COMBO_BOX (m_available_versions), 0); + gtk_button_set_label (GTK_BUTTON (m_install_button), _("Install")); } else - gtk_widget_hide (m_available_box); + gtk_widget_hide (m_install_button); + } - // is locked - if (allLocked || allUnlocked) { - gtk_widget_show (m_lock_button); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_lock_button), allLocked); - gtk_button_set_image (GTK_BUTTON (m_lock_button), - allLocked ? m_locked_image : m_unlocked_image); - gtk_widget_set_sensitive (m_install_button, !allLocked); - gtk_widget_set_sensitive (m_remove_button, !allLocked); - } - else { - gtk_widget_hide (m_lock_button); - gtk_widget_set_sensitive (m_install_button, TRUE); - gtk_widget_set_sensitive (m_remove_button, TRUE); - } - gtk_widget_show (m_vbox); + // is locked + if (allLocked || allUnlocked) { + gtk_widget_show (m_lock_button); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_lock_button), allLocked); + gtk_button_set_image (GTK_BUTTON (m_lock_button), + allLocked ? m_locked_image : m_unlocked_image); + gtk_widget_set_sensitive (m_install_button, !allLocked); + gtk_widget_set_sensitive (m_remove_button, !allLocked); + } + else { + gtk_widget_hide (m_lock_button); + gtk_widget_set_sensitive (m_install_button, TRUE); + gtk_widget_set_sensitive (m_remove_button, TRUE); } + + if (allModified) + gtk_widget_show (m_undo_button); else - gtk_widget_hide (m_vbox); + gtk_widget_hide (m_undo_button); -#if 0 - m_package = package; - if (package) { - if (package->isInstalled()) { - gtk_widget_show (m_remove_button); - gtk_widget_hide (m_install_button); + gtk_image_clear (GTK_IMAGE (m_package_image)); + if (single_package) { + GtkIconTheme *icons = gtk_icon_theme_get_default(); + GdkPixbuf *pixbuf = gtk_icon_theme_load_icon (icons, + single_package->name().c_str(), 32, GtkIconLookupFlags (0), NULL); + if (pixbuf) { + gtk_image_set_from_pixbuf (GTK_IMAGE (m_package_image), pixbuf); + g_object_unref (G_OBJECT (pixbuf)); } - else { - gtk_widget_show (m_install_button); - gtk_widget_hide (m_remove_button); - } - if (package && package->hasUpgrade()) - gtk_widget_show (m_upgrade_button); - else - gtk_widget_hide (m_upgrade_button); } - else { - gtk_widget_hide (m_install_button); - gtk_widget_hide (m_remove_button); - gtk_widget_hide (m_upgrade_button); - } -#endif } private: @@ -1011,9 +1156,9 @@ for (std::list <Ypp::Package *>::iterator it = pThis->m_packages.begin(); it != pThis->m_packages.end(); it++) { int version; - if (GTK_WIDGET_VISIBLE (pThis->m_versions_combo)) + if (GTK_WIDGET_VISIBLE (pThis->m_available_versions)) version = gtk_combo_box_get_active (GTK_COMBO_BOX ( - pThis->m_versions_combo)); + pThis->m_available_versions)); else version = 0; // i.e. most recent (on multi-packages) (*it)->install (version); @@ -1033,62 +1178,50 @@ normalCursor(); } - static void undo_clicked_cb (GtkButton *button, PackageControl *pThis) + static void locked_toggled_cb (GtkToggleButton *button, PackageControl *pThis) { + bool lock = gtk_toggle_button_get_active (button); busyCursor(); Ypp::get()->startTransactions(); for (std::list <Ypp::Package *>::iterator it = pThis->m_packages.begin(); it != pThis->m_packages.end(); it++) - (*it)->undo(); + (*it)->lock (lock); Ypp::get()->finishTransactions(); normalCursor(); } - static void locked_toggled_cb (GtkToggleButton *button, PackageControl *pThis) + static void undo_clicked_cb (GtkButton *button, PackageControl *pThis) { busyCursor(); Ypp::get()->startTransactions(); for (std::list <Ypp::Package *>::iterator it = pThis->m_packages.begin(); it != pThis->m_packages.end(); it++) - (*it)->lock (gtk_toggle_button_get_active (button)); + (*it)->undo(); Ypp::get()->finishTransactions(); normalCursor(); } static void version_changed_cb (GtkComboBox *combo, PackageControl *pThis) { - fprintf (stderr, "version changed\n"); - if (!pThis->m_packages.empty()) { + if (pThis->m_packages.size() == 1) { Ypp::Package *package = pThis->m_packages.front(); - int nb; - GtkTreeIter iter; - if (gtk_combo_box_get_active_iter (combo, &iter)) { - gtk_tree_model_get (pThis->m_versions_model, &iter, 1, &nb, -1); - const Ypp::Package::Version *version; - fprintf (stderr, "get available version %d\n", nb); - version = package->getAvailableVersion (nb); - g_assert (version != NULL); - - const Ypp::Repository *repo = Ypp::get()->getRepository (version->repo); - if (repo) { - std::string repo_str = repo->name + ")"; - gtk_label_set_text (GTK_LABEL (pThis->m_version_repo), repo_str.c_str()); - } - else - gtk_label_set_text (GTK_LABEL (pThis->m_version_repo), - "TODO: hide this for collections)"); + int nb = gtk_combo_box_get_active (GTK_COMBO_BOX (pThis->m_available_versions)); + if (nb == -1) return; - const char *installLabel = _("Install"); - if (package->isInstalled()) { - if (version->cmp > 0) - installLabel = _("Upgrade"); - else if (version->cmp == 0) - installLabel = _("Re-install"); - else //if (version->cmp < 0) - installLabel = _("Downgrade"); - } - gtk_button_set_label (GTK_BUTTON (pThis->m_install_button), installLabel); + const Ypp::Package::Version *version; + version = package->getAvailableVersion (nb); + assert (version != NULL); + + const char *installLabel = _("Install"); + if (package->isInstalled()) { + if (version->cmp > 0) + installLabel = _("Upgrade"); + else if (version->cmp == 0) + installLabel = _("Re-install"); + else //if (version->cmp < 0) + installLabel = _("Downgrade"); } + gtk_button_set_label (GTK_BUTTON (pThis->m_install_button), installLabel); } } @@ -1105,40 +1238,61 @@ } }; -class PackageInfo +class PackageDetails { GtkWidget *m_widget, *m_description, *m_filelist, *m_changelog, *m_authors; +PackageControl *m_control; public: GtkWidget *getWidget() { return m_widget; } - PackageInfo() + PackageDetails (Filters *filters) { + m_control = new PackageControl (filters); m_widget = gtk_notebook_new(); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (m_widget), GTK_POS_BOTTOM); + addPage (_("Status"), m_control->getWidget()); addPage (_("Description"), createHtmlWidget (&m_description)); addPage (_("File List"), createHtmlWidget (&m_filelist)); addPage (_("ChangeLog"), createHtmlWidget (&m_changelog)); addPage (_("Authors"), createHtmlWidget (&m_authors)); - gtk_widget_set_size_request (m_widget, -1, 150); ygtk_html_wrap_connect_link_clicked (m_filelist, G_CALLBACK (path_pressed_cb), NULL); } - void setPackage (Ypp::Package *package) + void setPackages (std::list <Ypp::Package *> packages) { - if (package) { - setText (m_description, package->description()); - setText (m_filelist, package->filelist()); - setText (m_changelog, package->changelog()); - setText (m_authors, package->authors()); - if (!GTK_WIDGET_VISIBLE (m_widget)) { - gtk_notebook_set_current_page (GTK_NOTEBOOK (m_widget), 0); - gtk_widget_show (m_widget); + if (packages.empty()) { + gtk_widget_hide (m_widget); + } + else { + gtk_widget_show (m_widget); + m_control->setPackages (packages); + Ypp::Package *package = packages.front(); + if (package) { + setText (m_description, package->description()); + setText (m_filelist, package->filelist()); + setText (m_changelog, package->changelog()); + setText (m_authors, package->authors()); + if (!GTK_WIDGET_VISIBLE (m_widget)) { + gtk_notebook_set_current_page (GTK_NOTEBOOK (m_widget), 0); + gtk_widget_show (m_widget); + } } } - else - gtk_widget_hide (m_widget); + } + + void packageModified (Ypp::Package *package) + { + // GTK+ doesn't fire selection change when a selected row changes, so we need + // to re-load PackageControl in that occasions. + std::list <Ypp::Package *>::iterator it; + for (it = m_control->m_packages.begin(); it != m_control->m_packages.end(); it++) + if (*it == package) + break; + if (it != m_control->m_packages.end()) + m_control->setPackages (m_control->m_packages); } private: @@ -1173,6 +1327,7 @@ } }; +#if 0 class DiskView : public Ypp::Disk::Listener { GtkWidget *m_widget; @@ -1230,7 +1385,7 @@ m_hasWarn = true; GtkWidget *dialog, *view; - dialog = gtk_message_dialog_new (YGUI::ui()->currentWindow(), + dialog = gtk_message_dialog_new (YGDialog::currentWindow(), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("Disk Almost Full !")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), @@ -1266,7 +1421,6 @@ GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_NEVER); -// gtk_widget_set_size_request (scroll, -1, 50); gtk_container_add (GTK_CONTAINER (scroll), view); gtk_widget_show_all (scroll); return scroll; @@ -1289,87 +1443,100 @@ return combo; } }; +#else +// disabled +struct DiskView +{ +GtkWidget *m_empty; +GtkWidget *getWidget() { return m_empty; } +DiskView() { m_empty = gtk_event_box_new(); } +}; +#endif class PackageSelector : public Filters::Listener, public PackagesView::Listener { PackagesView *m_packages; Filters *m_filters; -PackageInfo *m_info; -PackageControl *m_control; +PackageDetails *m_details; DiskView *m_disk; GtkWidget *m_box; -TrashWindow *m_trashWin; +ChangesPane *m_changes; public: GtkWidget *getWidget() { return m_box; } - PackageSelector() + PackageSelector (bool update_mode) { m_packages = new PackagesView(); + m_filters = new Filters (update_mode); + m_details = new PackageDetails (m_filters); + m_disk = new DiskView(); + m_changes = new ChangesPane(); m_packages->setListener (this); + m_filters->setListener (this); - m_control = new PackageControl(); - m_info = new PackageInfo(); + GtkWidget *filter_box = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (filter_box), gtk_label_new (_("Filters:")), FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (filter_box), m_filters->getNameWidget(), FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (filter_box), m_filters->getReposWidget(), FALSE, TRUE, 0); + + GtkWidget *categories_box = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (categories_box), m_filters->getCollectionWidget(), + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (categories_box), m_filters->getTypeWidget(), FALSE, TRUE, 0); + + GtkWidget *packages_box = gtk_hpaned_new(); + gtk_paned_pack1 (GTK_PANED (packages_box), categories_box, TRUE, TRUE); + gtk_paned_pack2 (GTK_PANED (packages_box), m_packages->getWidget(), TRUE, FALSE); + gtk_paned_set_position (GTK_PANED (packages_box), 180); + + GtkWidget *details_box = gtk_vpaned_new(); + gtk_paned_pack1 (GTK_PANED (details_box), packages_box, TRUE, FALSE); + gtk_paned_pack2 (GTK_PANED (details_box), m_details->getWidget(), TRUE, FALSE); + gtk_paned_set_position (GTK_PANED (details_box), 30000 /* minimal size */); GtkWidget *vbox = gtk_vbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), m_packages->getWidget(), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), m_control->getWidget(), FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), m_info->getWidget(), FALSE, TRUE, 0); - - m_filters = new Filters(); - m_filters->setListener (this); - m_disk = new DiskView(); + gtk_box_pack_start (GTK_BOX (vbox), m_filters->getStatusesWidget(), FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), filter_box, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), details_box, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); - GtkWidget *left_box = gtk_vbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (left_box), m_filters->getWidget(), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (left_box), m_disk->getWidget(), FALSE, TRUE, 0); + GtkWidget *changes_box = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (changes_box), m_changes->getWidget(), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (changes_box), m_disk->getWidget(), FALSE, TRUE, 0); m_box = gtk_hbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (m_box), left_box, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (m_box), vbox, TRUE, TRUE, 0); - gtk_widget_show_all (m_box); - - m_control->setPackages (std::list <Ypp::Package*> ()); - m_info->setPackage (NULL); + gtk_box_pack_start (GTK_BOX (m_box), changes_box, FALSE, TRUE, 0); - m_trashWin = new TrashWindow(); + gtk_widget_show_all (m_box); + m_changes->setContainer (changes_box); + m_details->setPackages (std::list <Ypp::Package *> ()); } ~PackageSelector() { delete m_packages; - delete m_control; - delete m_info; + delete m_details; delete m_filters; delete m_disk; - delete m_trashWin; + delete m_changes; } virtual void doQuery (Ypp::Query *query) { - m_packages->query (query); + m_packages->setQuery (query); } virtual void packagesSelected (const std::list <Ypp::Package *> &packages) { - m_control->setPackages (packages); - if (packages.size() == 1) - m_info->setPackage (packages.front()); - else - m_info->setPackage (NULL); + m_details->setPackages (packages); } void packageModified (Ypp::Package *package) { - // GTK+ doesn't fire selection change when a selected row changes, so we need - // to re-load PackageControl in that occasions. - std::list <Ypp::Package *>::iterator it; - for (it = m_control->m_packages.begin(); it != m_control->m_packages.end(); it++) - if (*it == package) - break; - if (it != m_control->m_packages.end()) - m_control->setPackages (m_control->m_packages); + m_details->packageModified (package); } }; @@ -1380,35 +1547,36 @@ PackageSelector *m_package_selector; public: - YGPackageSelector (const YWidgetOpt &opt, YGWidget *parent) - : YPackageSelector (opt), + YGPackageSelector (YWidget *parent, long mode) + : YPackageSelector (NULL, mode), YGWidget (this, parent, true, YGTK_TYPE_WIZARD, NULL) { setBorder (0); - YGDialog *dialog = YGUI::ui()->currentYGDialog(); + YGTK_WIZARD (getWidget())->child_border_width = 0; + + YGDialog *dialog = YGDialog::currentDialog(); dialog->setCloseCallback (confirm_cb, this); - GtkWindow *window = dialog->getWindow(); - gtk_window_resize (window, GTK_WIDGET (window)->allocation.width, - MAX (580, GTK_WIDGET (window)->allocation.height)); + GtkWindow *window = YGDialog::currentWindow(); + gtk_window_resize (window, + MAX (700, GTK_WIDGET (window)->allocation.width), + MAX (680, GTK_WIDGET (window)->allocation.height)); YGtkWizard *wizard = YGTK_WIZARD (getWidget()); ygtk_wizard_set_header_icon (wizard, window, - THEMEDIR "/icons/32x32/apps/yast-software.png"); + THEMEDIR "/icons/22x22/apps/yast-software.png"); ygtk_wizard_set_header_text (wizard, window, _("Package Selector")); - ygtk_wizard_set_help_text (wizard, - _("TO WRITE") - ); + ygtk_wizard_set_help_text (wizard, ""); ygtk_wizard_set_abort_button_label (wizard, _("_Cancel")); - ygtk_wizard_set_abort_button_id (wizard, g_strdup ("cancel"), g_free); + ygtk_wizard_set_abort_button_str_id (wizard, "cancel"); ygtk_wizard_set_back_button_label (wizard, ""); ygtk_wizard_set_next_button_label (wizard, _("_Accept")); - ygtk_wizard_set_next_button_id (wizard, g_strdup ("accept"), g_free); + ygtk_wizard_set_next_button_str_id (wizard, "accept"); g_signal_connect (G_OBJECT (getWidget()), "action-triggered", G_CALLBACK (wizard_action_cb), this); - m_package_selector = new PackageSelector(); + m_package_selector = new PackageSelector (onlineUpdateMode()); gtk_container_add (GTK_CONTAINER (wizard), m_package_selector->getWidget()); Ypp::get()->setInterface (this); @@ -1445,7 +1613,7 @@ GtkWidget *dialog; dialog = gtk_message_dialog_new - (YGUI::ui()->currentWindow(), + (YGDialog::currentWindow(), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, _("Changes not saved!")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), @@ -1466,7 +1634,7 @@ { std::string title = package->name() + _(" License Agreement"); GtkWidget *dialog = gtk_dialog_new_with_buttons (title.c_str(), - YGUI::ui()->currentWindow(), GTK_DIALOG_NO_SEPARATOR, + YGDialog::currentWindow(), GTK_DIALOG_NO_SEPARATOR, _("_Reject"), GTK_RESPONSE_REJECT, _("_Accept"), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); @@ -1497,7 +1665,6 @@ virtual bool resolveProblems (std::list <Ypp::Problem *> problems) { -fprintf (stderr, "resolving %d problems\n", problems.size()); // we can't use ordinary radio buttons, as gtk+ enforces that in a group // one must be selected... @@ -1536,15 +1703,6 @@ gtk_tree_model_get_iter (model, &iter, path); gtk_tree_store_set (store, &iter, ACTIVE_TOGGLE_COL, enabled, -1); } -#if 0 - static void renderer_toggled_cb (GtkCellRenderer *render, gchar *path_str, - GtkTreeModel *model) - { - GtkTreePath *path = gtk_tree_path_new_from_string (path_str); - solution_toggled (model, path); - gtk_tree_path_free (path); - } -#endif static void cursor_changed_cb (GtkTreeView *view, GtkTreeModel *model) { GtkTreePath *path; @@ -1572,33 +1730,6 @@ } } return FALSE; - - -/* - GtkTreePath *path; - if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view), x, y, - &path, NULL, NULL, NULL)) { - GtkTreeIter iter; - gchar *tooltip_text; - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_path_free (path); - gtk_tree_model_get (model, &iter, - TOOLTIP_TEXT_COL, &tooltip_text, -1); - // some strings are just " ", so we need to check that - // now, - bool empty = true; - for (int i = 0; tooltip_text[i] && empty; i++) - if (tooltip_text[i] != ' ') - empty = false; - if (empty) - gtk_tooltip_set_text (tooltip, "(no details)"); - else - gtk_tooltip_set_text (tooltip, tooltip_text); - g_free (tooltip_text); - return TRUE; - } - return FALSE; -*/ } }; @@ -1629,7 +1760,7 @@ } // interface - GtkWidget *dialog = gtk_message_dialog_new (YGUI::ui()->currentWindow(), + GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(), GtkDialogFlags (0), GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, _("There are some conflicts on the transaction that must be " "solved manually.")); @@ -1649,8 +1780,6 @@ renderer = gtk_cell_renderer_toggle_new(); gtk_cell_renderer_toggle_set_radio ( GTK_CELL_RENDERER_TOGGLE (renderer), TRUE); -/* g_signal_connect (G_OBJECT (renderer), "toggled", - G_CALLBACK (inner::renderer_toggled_cb), store);*/ // we should not connect the actual toggle button, as we toggle on row press g_signal_connect (G_OBJECT (view), "cursor-changed", G_CALLBACK (inner::cursor_changed_cb), store); @@ -1674,63 +1803,6 @@ gtk_container_add (GTK_CONTAINER (scroll), view); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), scroll); - -#if 0 - // version that uses viewport, labels and radio buttons -- unfortunately, - // gtk+ enforces that one radio button per group to be selected -- we don't - // want that as the user may decide to do nothing for a certain action. - // We also don't want to add a "Do nothing" radio, as that would imply would - // dismiss the conflict. No, we just want to let the user try to resolve current - // conflicts... - struct inner { - static void solution_toggled (GtkToggleButton *toggle, bool *apply) - { *apply = gtk_toggle_button_get_active (toggle); } - }; - - GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Problem Resolver"), - YGUI::ui()->currentWindow(), GtkDialogFlags (0), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, NULL); - - GtkWidget *view_port = gtk_viewport_new (NULL, NULL); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (view_port), GTK_SHADOW_NONE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), view_port, - TRUE, TRUE, 0); - GtkWidget *main_box = gtk_vbox_new (FALSE, 6); - gtk_container_add (GTK_CONTAINER (view_port), main_box); - -fprintf (stderr, "populating main box\n"); - for (std::list <Ypp::Problem *>::iterator it = problems.begin(); - it != problems.end(); it++) { - GtkWidget *label, *box; -fprintf (stderr, "creating label: %s\n", (*it)->description.c_str()); - label = gtk_label_new ((*it)->description.c_str()); - YGUtils::setWidgetFont (label, PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM); -fprintf (stderr, "setting tooltyp: %s\n", (*it)->details.c_str()); - if (!(*it)->details.empty()) - gtk_widget_set_tooltip_text (label, (*it)->details.c_str()); - - GSList *group = NULL; - box = gtk_vbox_new (FALSE, 6); - for (int i = 0; (*it)->getSolution (i); i++) { - Ypp::Problem::Solution *solution = (*it)->getSolution (i); -fprintf (stderr, "creating radio: %s\n", solution->description.c_str()); - GtkWidget *radio = gtk_radio_button_new_with_label ( - group, solution->description.c_str()); -fprintf (stderr, "setting tooltip: %s\n", (*it)->details.c_str()); - if (!solution->details.empty()) - gtk_widget_set_tooltip_text (radio, solution->details.c_str()); - group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)); - gtk_box_pack_start (GTK_BOX (box), radio, FALSE, TRUE, 0); - g_signal_connect (G_OBJECT (radio), "toggled", - G_CALLBACK (inner::solution_toggled), &solution->apply); - } - - gtk_box_pack_start (GTK_BOX (main_box), label, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (main_box), box, FALSE, TRUE, 0); - } -#endif - gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); gtk_window_set_default_size (GTK_WINDOW (dialog), -1, 480); gtk_widget_show_all (dialog); @@ -1748,22 +1820,22 @@ YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createPackageSelector (YWidget *parent, YWidgetOpt &opt, - const YCPString &floppyDevice) +#else +#include "YPackageSelector.h" +class YGPackageSelector : public YPackageSelector, public YGWidget { -/* if (opt.youMode.value()) - return new YGPatchSelector (opt, YGWidget::get (parent)); - else*/ - return new YGPackageSelector (opt, YGWidget::get (parent)); -} +public: + YGPackageSelector (YWidget *parent, long mode) + : YPackageSelector (NULL, mode), + YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) + { + } + YGWIDGET_IMPL_COMMON +}; +#endif -YWidget * -YGUI::createPkgSpecial (YWidget *parent, YWidgetOpt &opt, - const YCPString &subwidget) +YPackageSelector *YGWidgetFactory::createPackageSelector (YWidget *parent, long mode) { - // same as Qt's - y2error ("The GTK+ UI does not support PkgSpecial subwidgets!"); - return 0; + return new YGPackageSelector (parent, mode); } Modified: trunk/gtk/src/YGProgressBar.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGProgressBar.cc?rev=4321... ============================================================================== --- trunk/gtk/src/YGProgressBar.cc (original) +++ trunk/gtk/src/YGProgressBar.cc Thu Dec 20 21:44:06 2007 @@ -11,48 +11,34 @@ class YGProgressBar : public YProgressBar, public YGLabeledWidget { - bool m_pulse; public: - YGProgressBar (const YWidgetOpt &opt, YGWidget *parent, - const YCPString& label, - const YCPInteger& maxprogress, const YCPInteger& progress) - : YProgressBar (opt, label, maxprogress, progress) + YGProgressBar (YWidget *parent, const string &label, int maxValue) + : YProgressBar (NULL, label, maxValue) + // NOTE: its label widget is positionated at the vertical, because its label + // may change often and so will its size, which will look odd (we may want + // to make the label widget to only grow). , YGLabeledWidget (this, parent, label, YD_VERT, true, GTK_TYPE_PROGRESS_BAR, NULL) - { - m_pulse = maxprogress->value() <= 0; - } - // NOTE: its label widget is positionated at the vertical, because its label - // may change often and so will its size, which will look odd (we may want - // to make the label widget to only grow). - - virtual ~YGProgressBar() {} + {} // YProgressBar - virtual void setProgress (const YCPInteger& newProgress) + virtual void setValue (int value) { IMPL - if (m_pulse) - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (getWidget())); - else { - float fraction = (float) newProgress->value() / maxProgress->value(); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (getWidget()), fraction); - } - YProgressBar::setProgress (newProgress); + float fraction = ((float) value) / maxValue(); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (getWidget()), fraction); + YProgressBar::setValue (value); } YGWIDGET_IMPL_COMMON YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YProgressBar) }; -YWidget * -YGUI::createProgressBar (YWidget* parent, YWidgetOpt& opt, - const YCPString& label, const YCPInteger& maxprogress, - const YCPInteger& progress) -{ - IMPL; - return new YGProgressBar (opt, YGWidget::get (parent), - label, maxprogress, progress); +YProgressBar *YGWidgetFactory::createProgressBar (YWidget *parent, const string &label, + int maxValue) +{ + IMPL + return new YGProgressBar (parent, label, maxValue); } #include "YDownloadProgress.h" @@ -62,10 +48,9 @@ guint timeout_id; public: - YGDownloadProgress (const YWidgetOpt &opt, YGWidget *parent, - const YCPString& label, const YCPString &filename, - int expectedSize) - : YDownloadProgress (opt, label, filename, expectedSize) + YGDownloadProgress (YWidget *parent, const string &label, + const string &filename, YFileSize_t expectedFileSize) + : YDownloadProgress (NULL, label, filename, expectedFileSize) , YGLabeledWidget (this, parent, label, YD_HORIZ, true, GTK_TYPE_PROGRESS_BAR, NULL) { @@ -77,16 +62,16 @@ g_source_remove (timeout_id); } - virtual void setExpectedSize (int expectedSize) + virtual void setExpectedSize (YFileSize_t size) { - YDownloadProgress::setExpectedSize (expectedSize); - timeout_cb(this); // force an update + YDownloadProgress::setExpectedSize (size); + timeout_cb (this); // force an update } static gboolean timeout_cb (void *pData) { YGDownloadProgress *pThis = (YGDownloadProgress*) pData; - float fraction = (float) pThis->currentFileSize() / pThis->expectedSize(); + float fraction = ((float) pThis->currentFileSize()) / pThis->expectedSize(); if (fraction > 1) fraction = 1; gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pThis->getWidget()), fraction); return TRUE; @@ -96,14 +81,11 @@ YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YDownloadProgress) }; -YWidget * -YGUI::createDownloadProgress (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, const YCPString &filename, - int expectedSize) +YDownloadProgress *YGOptionalWidgetFactory::createDownloadProgress (YWidget *parent, + const string &label, const string &filename, YFileSize_t expectedFileSize) { IMPL - return new YGDownloadProgress (opt, YGWidget::get (parent), - label, filename, expectedSize); + return new YGDownloadProgress (parent, label, filename, expectedFileSize); } #include "ygtkratiobox.h" @@ -112,21 +94,20 @@ class YGMultiProgressMeter : public YMultiProgressMeter, public YGWidget { public: - YGMultiProgressMeter (const YWidgetOpt &opt, YGWidget *parent, - bool horizontal, const YCPList &maxValues) - : YMultiProgressMeter (opt, horizontal, maxValues) + YGMultiProgressMeter (YWidget *parent, YUIDimension dim, const vector<float> &maxValues) + : YMultiProgressMeter (NULL, dim, maxValues) , YGWidget (this, parent, true, - horizontal ? YGTK_TYPE_RATIO_HBOX : YGTK_TYPE_RATIO_VBOX, NULL) + horizontal() ? YGTK_TYPE_RATIO_HBOX : YGTK_TYPE_RATIO_VBOX, NULL) { // ygtk_ratio_box_set_homogeneous (YGTK_RATIO_BOX (getWidget()), TRUE); ygtk_ratio_box_set_spacing (YGTK_RATIO_BOX (getWidget()), 2); for (int s = 0; s < segments(); s++) { GtkWidget* bar = gtk_progress_bar_new(); gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (bar), - horizontal ? GTK_PROGRESS_LEFT_TO_RIGHT : GTK_PROGRESS_BOTTOM_TO_TOP); + horizontal() ? GTK_PROGRESS_LEFT_TO_RIGHT : GTK_PROGRESS_BOTTOM_TO_TOP); // Progress bars would ask for too much size with weight... const int min_size = 5; - if (horizontal) + if (horizontal()) gtk_widget_set_size_request (bar, min_size, -1); else gtk_widget_set_size_request (bar, -1, min_size); @@ -134,8 +115,8 @@ getSegmentWeight (s), TRUE, TRUE, 0); } - ygtk_adj_size_set_max (YGTK_ADJ_SIZE (m_adj_size), horizontal ? 200 : 0, - horizontal ? 0 : 200); + ygtk_adj_size_set_max (YGTK_ADJ_SIZE (m_adj_size), horizontal() ? 200 : 0, + horizontal() ? 0 : 200); gtk_widget_show_all (getWidget()); } @@ -160,7 +141,7 @@ { if (vertical()) n = (segments() - n) - 1; - if (currentValue (n) == -1) + if (currentValue (n) < 0) return 0; return 1.0 - (((float) currentValue (n)) / maxValue (n)); } @@ -168,10 +149,9 @@ YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createMultiProgressMeter (YWidget *parent, YWidgetOpt &opt, - bool horizontal, const YCPList &maxValues) +YMultiProgressMeter *YGOptionalWidgetFactory::createMultiProgressMeter (YWidget *parent, + YUIDimension dim, const vector<float> &maxValues) { - return new YGMultiProgressMeter (opt, YGWidget::get (parent), - horizontal, maxValues); + return new YGMultiProgressMeter (parent, dim, maxValues); } + Modified: trunk/gtk/src/YGPushButton.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGPushButton.cc?rev=43216... ============================================================================== --- trunk/gtk/src/YGPushButton.cc (original) +++ trunk/gtk/src/YGPushButton.cc Thu Dec 20 21:44:06 2007 @@ -11,67 +11,86 @@ class YGPushButton : public YPushButton, public YGWidget { +GtkWidget *m_image; + public: - YGPushButton (const YWidgetOpt &opt, YGWidget *parent, YCPString label) - : YPushButton (opt, label), + YGPushButton (YWidget *parent, const string &label) + : YPushButton (NULL, label), YGWidget (this, parent, true, GTK_TYPE_BUTTON, "can-default", TRUE, NULL) { IMPL - if (!opt.isShrinkable.value()) - setMinSizeInChars (10, 0); - + m_image = NULL; + setMinSizeInChars (10, 0); gtk_button_set_use_underline (GTK_BUTTON (getWidget()), TRUE); setLabel (label); - g_signal_connect (G_OBJECT (getWidget ()), "clicked", G_CALLBACK (clicked_cb), this); - if (opt.isDefaultButton.value()) - g_signal_connect (G_OBJECT (getWidget ()), "realize", - G_CALLBACK (set_default_cb), this); } // YPushButton - virtual void setLabel (const YCPString &label) + virtual void setLabel (const string &label) { IMPL - string str = YGUtils::mapKBAccel (label->value_cstr()); + string str = YGUtils::mapKBAccel (label); gtk_button_set_label (GTK_BUTTON (getWidget()), str.c_str()); YGUtils::setStockIcon (getWidget(), str); YPushButton::setLabel (label); } - virtual void setIcon (const YCPString &icon_name) + virtual void setIcon (const string &icon) { IMPL - string path = icon_name->value(); - if (path[0] != '/') - path = ICON_DIR + path; - - GError *error = 0; - GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (path.c_str(), &error); - if (pixbuf) { - GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf); - gtk_button_set_image (GTK_BUTTON (getWidget()), image); - g_object_unref (G_OBJECT (pixbuf)); + if (icon.empty()) + // no need to worry about freeing m_image, let it live with button + gtk_widget_hide (m_image); + else { + string path (icon); + if (path[0] != '/') + path = ICON_DIR + path; + + GError *error = 0; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (path.c_str(), &error); + if (pixbuf) { + m_image = gtk_image_new_from_pixbuf (pixbuf); + gtk_button_set_image (GTK_BUTTON (getWidget()), m_image); + g_object_unref (G_OBJECT (pixbuf)); + } + else + y2warning ("YGPushButton: Couldn't load icon image: %s.\n" + "Reason: %s", path.c_str(), error->message); } - else - y2warning ("YGPushButton: Couldn't load icon image: %s.\n" - "Reason: %s", path.c_str(), error->message); } - static void set_default_cb (GtkButton *button, YGPushButton *pThis) - { gtk_widget_grab_default (GTK_WIDGET (button)); } + virtual void setDefaultButton (bool isDefault) + { + if (isDefault) { + GtkWidget *button = getWidget(); + GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); + gtk_widget_grab_default (button); + if (GTK_WIDGET_REALIZED (button)) + gtk_widget_grab_focus (button); + else + g_signal_connect (G_OBJECT (button), "realize", + G_CALLBACK (realize_cb), this); + } + YPushButton::setDefaultButton (isDefault); + } + // Events static void clicked_cb (GtkButton *button, YGPushButton *pThis) { pThis->emitEvent (YEvent::Activated, false); } + // give focus to default buttons, once they are realized + static void realize_cb (GtkWidget *widget) + { + gtk_widget_grab_focus (widget); + } + YGWIDGET_IMPL_COMMON }; -YWidget * -YGUI::createPushButton (YWidget *parent, YWidgetOpt &opt, - const YCPString &label) +YPushButton *YGWidgetFactory::createPushButton (YWidget *parent, const string &label) { - return new YGPushButton (opt, YGWidget::get (parent), label); + return new YGPushButton (parent, label); } Modified: trunk/gtk/src/YGRadioButton.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGRadioButton.cc?rev=4321... ============================================================================== --- trunk/gtk/src/YGRadioButton.cc (original) +++ trunk/gtk/src/YGRadioButton.cc Thu Dec 20 21:44:06 2007 @@ -4,8 +4,7 @@ #include <config.h> #include <ycp/y2log.h> -#include <YGUI.h> -#include "YEvent.h" +#include "YGUI.h" #include "YGUtils.h" #include "YGWidget.h" @@ -38,23 +37,15 @@ class YGRadioButton : public YRadioButton, public YGWidget { - bool m_isBold; - public: - - YGRadioButton (const YWidgetOpt &opt, - YGWidget *parent, - YCPString label, - YRadioButtonGroup *rbg, - bool checked) - : YRadioButton (opt, label, rbg), + YGRadioButton (YWidget *parent, const std::string &label, bool isChecked) + : YRadioButton (NULL, label), YGWidget (this, parent, true, getCheckRadioButtonType(), NULL) { IMPL setBorder (0); - setValue (YCPBoolean (checked)); + setValue (isChecked); - m_isBold = opt.boldFont.value(); gtk_button_set_use_underline (GTK_BUTTON (getWidget()), TRUE); setLabel (label); @@ -63,67 +54,64 @@ } // YRadioButton - virtual void setLabel (const YCPString &text) + virtual void setLabel (const string &text) { // NOTE: we can't just set a gtk_widget_modify() at the initialization // because each gtk_button_set_label() creates a new label IMPL - string str = YGUtils::mapKBAccel(text->value_cstr()); - if (m_isBold) - str = "<b>" + str + "</b>"; + string str = YGUtils::mapKBAccel(text.c_str()); gtk_button_set_label (GTK_BUTTON (getWidget()), str.c_str()); YRadioButton::setLabel (text); + } - GtkWidget *label = gtk_bin_get_child (GTK_BIN (getWidget())); - gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + virtual bool value() + { + IMPL + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (getWidget())); } - virtual void setValue (const YCPBoolean &checked) + virtual void setValue (bool checked) { IMPL + fprintf (stderr, "setValue: %d to %s\n", checked, getDebugLabel().c_str()); g_signal_handlers_block_by_func (getWidget(), (gpointer) toggled_cb, this); - if (checked->value()) - buttonGroup()->uncheckOtherButtons (this); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (getWidget()), - checked->value()); + if (checked) + buttonGroup()->uncheckOtherButtons ((YRadioButton *) this); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (getWidget()), checked); g_signal_handlers_unblock_by_func (getWidget(), (gpointer) toggled_cb, this); } - virtual YCPBoolean getValue() - { - IMPL - return YCPBoolean (gtk_toggle_button_get_active - (GTK_TOGGLE_BUTTON (getWidget()))); - } - - // YWidget YGWIDGET_IMPL_COMMON + YGWIDGET_IMPL_USE_BOLD (YRadioButton) // callbacks static void toggled_cb (GtkButton *button, YGRadioButton *pThis) { IMPL +fprintf(stderr, "toggled\n"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) - pThis->buttonGroup()->uncheckOtherButtons (pThis); +{ +fprintf(stderr, "uncheck others\n"); + pThis->buttonGroup()->uncheckOtherButtons ((YRadioButton *) pThis); +// pThis->emitEvent (YEvent::ValueChanged); +} else { + // leave it active g_signal_handlers_block_by_func (button, (gpointer) toggled_cb, pThis); +fprintf(stderr, "set active\n"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); g_signal_handlers_unblock_by_func (button, (gpointer) toggled_cb, pThis); } - - pThis->emitEvent (YEvent::ValueChanged); } }; -YWidget * -YGUI::createRadioButton (YWidget *parent, YWidgetOpt &opt, - YRadioButtonGroup *rbg, const YCPString &label, - bool checked) +YRadioButton *YGWidgetFactory::createRadioButton (YWidget *parent, const string &label, + bool isChecked) { - IMPL; - return new YGRadioButton (opt, YGWidget::get (parent), label, rbg, checked); + IMPL + return new YGRadioButton (parent, label, isChecked); } // YRadioButtonGroup @@ -131,22 +119,19 @@ class YGRadioButtonGroup : public YRadioButtonGroup, public YGWidget { public: - YGRadioButtonGroup(const YWidgetOpt &opt, - YGWidget *parent) - : YRadioButtonGroup (opt), + YGRadioButtonGroup(YWidget *parent) + : YRadioButtonGroup (NULL), YGWidget (this, parent, true, GTK_TYPE_EVENT_BOX, NULL) - { } + {} YGWIDGET_IMPL_COMMON YGWIDGET_IMPL_CHILD_ADDED (m_widget) YGWIDGET_IMPL_CHILD_REMOVED (m_widget) }; -YContainerWidget * -YGUI::createRadioButtonGroup (YWidget *parent, YWidgetOpt &opt) +YRadioButtonGroup *YGWidgetFactory::createRadioButtonGroup (YWidget *parent) { - IMPL; - return new YGRadioButtonGroup (opt, YGWidget::get (parent)); + return new YGRadioButtonGroup (parent); } #include "YCheckBox.h" @@ -156,88 +141,81 @@ bool m_isBold; public: - YGCheckBox(const YWidgetOpt &opt, - YGWidget *parent, - const YCPString &label_str, - bool checked) - : YCheckBox (opt, label_str), + YGCheckBox(YWidget *parent, const string &label, bool isChecked) + : YCheckBox (NULL, label), YGWidget (this, parent, true, GTK_TYPE_CHECK_BUTTON, NULL) { IMPL setBorder (0); - m_isBold = opt.boldFont.value(); gtk_button_set_use_underline (GTK_BUTTON (getWidget()), TRUE); - setLabel (label_str); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (getWidget()), checked); + setLabel (label); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (getWidget()), isChecked); g_signal_connect (G_OBJECT (getWidget ()), "toggled", G_CALLBACK (toggled_cb), this); } // YCheckButton - virtual void setLabel (const YCPString &text) + virtual void setLabel (const string &text) { IMPL - string str = YGUtils::mapKBAccel(text->value_cstr()); - if (m_isBold) - str = "<b>" + str + "</b>"; + string str = YGUtils::mapKBAccel(text); gtk_button_set_label (GTK_BUTTON (getWidget()), str.c_str()); YCheckBox::setLabel (text); + } - GtkWidget *label = gtk_bin_get_child (GTK_BIN (getWidget())); - gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + virtual YCheckBoxState value() + { + IMPL + GtkToggleButton *button = GTK_TOGGLE_BUTTON (getWidget()); + + if (gtk_toggle_button_get_inconsistent (button)) + return YCheckBox_dont_care; + return gtk_toggle_button_get_active (button) ? YCheckBox_on : YCheckBox_off; } - virtual void setValue (const YCPValue &val) + virtual void setValue (YCheckBoxState value) { - IMPL; + IMPL GtkToggleButton *button = GTK_TOGGLE_BUTTON (getWidget()); g_signal_handlers_block_by_func (getWidget(), (gpointer) toggled_cb, this); - if (val->isBoolean()) { - gtk_toggle_button_set_inconsistent (button, FALSE); - gtk_toggle_button_set_active (button, val->asBoolean()->value()); + switch (value) { + case YCheckBox_dont_care: + gtk_toggle_button_set_inconsistent (button, TRUE); + break; + case YCheckBox_on: + gtk_toggle_button_set_inconsistent (button, FALSE); + gtk_toggle_button_set_active (button, TRUE); + break; + case YCheckBox_off: + gtk_toggle_button_set_inconsistent (button, FALSE); + gtk_toggle_button_set_active (button, FALSE); + break; } - else - gtk_toggle_button_set_inconsistent (button, TRUE); g_signal_handlers_unblock_by_func (getWidget(), (gpointer) toggled_cb, this); } - virtual YCPValue getValue() - { - IMPL; - - GtkToggleButton *button = GTK_TOGGLE_BUTTON (getWidget()); - - if (gtk_toggle_button_get_inconsistent (button)) - return YCPVoid(); - else - return YCPBoolean (gtk_toggle_button_get_active (button)); - } - static void toggled_cb (GtkBox *box, YGCheckBox *pThis) { IMPL GtkToggleButton *button = GTK_TOGGLE_BUTTON (box); - if (gtk_toggle_button_get_inconsistent (button)) { - gtk_toggle_button_set_inconsistent (button, false); - pThis->setValue (YCPBoolean (true)); - } - + if (gtk_toggle_button_get_inconsistent (button)) + pThis->setValue (YCheckBox_on); pThis->emitEvent (YEvent::ValueChanged); } YGWIDGET_IMPL_COMMON + YGWIDGET_IMPL_USE_BOLD (YCheckBox) }; -YWidget * -YGUI::createCheckBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - bool checked) +YCheckBox *YGWidgetFactory::createCheckBox (YWidget *parent, const string &label, + bool isChecked) { - IMPL; - return new YGCheckBox (opt, YGWidget::get (parent), label, checked); + IMPL + return new YGCheckBox (parent, label, isChecked); } + Modified: trunk/gtk/src/YGTable.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGTable.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGTable.cc (original) +++ trunk/gtk/src/YGTable.cc Thu Dec 20 21:44:06 2007 @@ -7,220 +7,138 @@ #include <YGUI.h> #include "YGUtils.h" #include "YGWidget.h" +#include "YSelectionWidget.h" +#include "YGSelectionModel.h" +#include "ygtkcellrenderertextpixbuf.h" /* A generic widget for table related widgets. */ -class YGTableView : public YGScrolledWidget +class YGTableView : public YGScrolledWidget, public YGSelectionModel { protected: int m_colsNb; public: - YGTableView (YWidget *y_widget, YGWidget *parent, - const YWidgetOpt &opt, YCPString label) - : YGScrolledWidget (y_widget, parent, label, YD_VERT, true, + YGTableView (YWidget *ywidget, YWidget *parent, const string &label, + bool ordinaryModel, bool isTree) + : YGScrolledWidget (ywidget, parent, label, YD_VERT, true, GTK_TYPE_TREE_VIEW, NULL) + , YGSelectionModel ((YSelectionWidget *) ywidget, ordinaryModel, isTree) { IMPL - m_colsNb = 0; + if (ordinaryModel) { + addColumn (GDK_TYPE_PIXBUF, "", YAlignUnchanged, YGSelectionModel::ICON_COLUMN); + addColumn (G_TYPE_STRING, "", YAlignUnchanged, YGSelectionModel::LABEL_COLUMN); + gtk_tree_view_set_model (getView(), getModel()); + } + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (getWidget()), FALSE); /* Yast tools expect the user to be unable to un-select the row. They generally don't check to see if the returned value is -1. So, just disallow un-selection. */ - gtk_tree_selection_set_mode (gtk_tree_view_get_selection ( - GTK_TREE_VIEW (getWidget())), GTK_SELECTION_BROWSE); + GtkTreeSelection *selection = gtk_tree_view_get_selection (getView()); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); // let the derivates do the event hooks. They have subtile differences. } - void initModel (const vector <GType> &types, bool show_headers) - { - IMPL - // turn vector into an array; last column dedicated to the row id - m_colsNb = types.size(); - GType types_array [m_colsNb+1]; - for (unsigned int i = 0; i < types.size(); i++) - types_array [i] = types[i]; - types_array[m_colsNb] = G_TYPE_INT; + inline GtkTreeView *getView() + { return GTK_TREE_VIEW (getWidget()); } - GtkListStore *list = gtk_list_store_newv (m_colsNb+1, types_array); - gtk_tree_view_set_model (GTK_TREE_VIEW (getWidget()), GTK_TREE_MODEL (list)); - g_object_unref (G_OBJECT (list)); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (getWidget()), show_headers); - } - - void insertColumn (int col_nb, string header, GType type) + void addColumn (GType type, string header, YAlignmentType header_align, int col_nb) { IMPL GtkTreeViewColumn *column = 0; // The allignment of the column items - gfloat xalign = 0.0; - if (header.length()) { - if (header[0] == 'R') - xalign = 1.0; - else if (header[0] == 'C') + gfloat xalign = -1; + switch (header_align) { + case YAlignBegin: + xalign = 0.0; + break; + case YAlignCenter: xalign = 0.5; - // else if (header[0] == 'L') - header = header.substr(1); - } + break; + case YAlignEnd: + xalign = 1.0; + break; + case YAlignUnchanged: + break; + } + GtkCellRenderer *renderer = 0; if (type == G_TYPE_STRING) { - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - g_object_set (renderer, "xalign", xalign, NULL); - // set the last column, the expandable one, as wrapable - if (col_nb == m_colsNb-1 && col_nb >= 3) - g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes (header.c_str(), renderer, "text", col_nb, NULL); } + else if (type == GDK_TYPE_PIXBUF) { + renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes (header.c_str(), + renderer, "pixbuf", col_nb, NULL); + } else if (type == G_TYPE_BOOLEAN) { // toggle button - GtkCellRenderer *renderer = gtk_cell_renderer_toggle_new(); + renderer = gtk_cell_renderer_toggle_new(); g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (col_nb)); - g_object_set (renderer, "xalign", xalign, NULL); column = gtk_tree_view_column_new_with_attributes (header.c_str(), renderer, "active", col_nb, NULL); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (toggled_cb), this); } - else if (type == GDK_TYPE_PIXBUF) { - GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new(); - g_object_set (renderer, "xalign", xalign, NULL); + else if (type == YGTK_TYPE_CELL_RENDERER_TEXT_PIXBUF) { // string, pixbuf combo + renderer = ygtk_cell_renderer_text_pixbuf_new(); + g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (col_nb)); column = gtk_tree_view_column_new_with_attributes (header.c_str(), - renderer, "pixbuf", col_nb, NULL); + renderer, "pixbuf", col_nb, "text", col_nb+1, NULL); } else g_error ("YGTable: no support for column of given type"); - gtk_tree_view_column_set_resizable (column, TRUE); - gtk_tree_view_insert_column (GTK_TREE_VIEW (getWidget()), column, col_nb); - } - - void setSearchCol (int col) - { - gtk_tree_view_set_search_column (GTK_TREE_VIEW (getWidget()), col); - } - -protected: - inline GtkListStore *getStore() - { return GTK_LIST_STORE (getModel()); } - inline GtkTreeModel *getModel() - { return gtk_tree_view_get_model (GTK_TREE_VIEW (getWidget())); } - -protected: - /* NOTE: gtk_list_store_insert() doesn't necessarly put the row in the - requested position. For instance, if the number of rows is smaller than - the one requested, it just appends it. So, we must translate YCP rows - numbering to the ones we set. We'll call YCP rows as ids. - Besides, if we do sorting, paths will get changed. */ - - bool getRowOf (GtkTreeIter *iter, int id) { - if (!gtk_tree_model_get_iter_first (getModel(), iter)) - return false; - - int _id = -1; - do { - gtk_tree_model_get (getModel(), iter, m_colsNb, &_id, -1); - if (_id == id) - return true; - } while (gtk_tree_model_iter_next (getModel(), iter)); - return false; - } - - int getIdOf (int row) { - GtkTreeIter iter; - if (!gtk_tree_model_iter_nth_child (getModel(), &iter, NULL, row)) - return -1; - - int id; - gtk_tree_model_get (getModel(), &iter, m_colsNb, &id, -1); - return id; - } + if (renderer && xalign != -1) + g_object_set (renderer, "xalign", xalign, NULL); - void addRow (int id) - { - IMPL - GtkTreeIter iter; - gtk_list_store_append (getStore(), &iter); - gtk_list_store_set (getStore(), &iter, m_colsNb, id, -1); + gtk_tree_view_column_set_resizable (column, TRUE); + gtk_tree_view_append_column (getView(), column); } - void setItemText (string text, int id, int col) - { - IMPL - GtkTreeIter iter; - if (getRowOf (&iter, id)) - gtk_list_store_set (getStore(), &iter, col, text.c_str(), -1); - } + virtual void setModel (GtkTreeModel *model) + { gtk_tree_view_set_model (GTK_TREE_VIEW (getWidget()), model); } - void setItemBool (gboolean state, int id, int col) + // YGSelectionModel + virtual void setFocusItem (GtkTreeIter *iter, bool addingRow) { - IMPL - GtkTreeIter iter; - if (getRowOf (&iter, id)) - gtk_list_store_set (getStore(), &iter, col, state, -1); - } + blockEvents(); + GtkTreePath *path = gtk_tree_model_get_path (getModel(), iter); - void setItemIcon (string icon, int id, int col) - { - IMPL - GtkTreeIter iter; - if (getRowOf (&iter, id)) { - GdkPixbuf *pixbuf; - if (icon[0] != '/') - icon = ICON_DIR + icon; - - GError *error = 0; - pixbuf = gdk_pixbuf_new_from_file (icon.c_str(), &error); - if (!pixbuf) - y2warning ("YGTable: Could not load icon: %s.\n" - "Because %s", icon.c_str(), error->message); + gtk_tree_view_expand_to_path (getView(), path); - gtk_list_store_set (getStore(), &iter, col, pixbuf, -1); - } + GtkTreeSelection *selection = gtk_tree_view_get_selection (getView()); + gtk_tree_selection_select_path (selection, path); + gtk_tree_view_set_cursor (getView(), path, NULL, FALSE); + gtk_tree_view_scroll_to_cell (getView(), path, NULL, TRUE, 0.5, 0.5); + gtk_tree_path_free (path); + gtk_widget_grab_focus (getWidget()); + unblockEvents(); } - void deleteRows() + virtual void unsetFocus() { - IMPL blockEvents(); - gtk_list_store_clear (getStore()); + GtkTreeSelection *selection = gtk_tree_view_get_selection (getView()); + gtk_tree_selection_unselect_all (selection); unblockEvents(); } - int getCurrentRow() + virtual YItem *focusItem() { - IMPL - GtkTreePath *path; - gtk_tree_view_get_cursor (GTK_TREE_VIEW(getWidget()), &path, NULL); - if (path == NULL) - return -1; - + GtkTreeSelection *selection = gtk_tree_view_get_selection (getView()); GtkTreeIter iter; - gtk_tree_model_get_iter (getModel(), &iter, path); - gtk_tree_path_free (path); - - int id; - gtk_tree_model_get (getModel(), &iter, m_colsNb, &id, -1); - return id; - } - - void setCurrentRow (int id) - { - IMPL - blockEvents(); - GtkTreeIter iter; - if (getRowOf (&iter, id)) { - GtkTreePath *path = gtk_tree_model_get_path (getModel(), &iter); - gtk_tree_view_set_cursor (GTK_TREE_VIEW (getWidget()), path, NULL, false); - gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (getWidget()), path, NULL, - TRUE, 0.5, 0.5); - gtk_tree_path_free (path); - } - unblockEvents(); + if (gtk_tree_selection_get_selected (selection, NULL, &iter)) + return getItem (&iter); + return NULL; } +protected: void blockEvents() { g_signal_handlers_block_by_func (getWidget(), (gpointer) selected_cb, this); @@ -239,18 +157,20 @@ GtkTreeIter iter; if (!gtk_tree_model_get_iter (getModel(), &iter, path)) return; - gboolean state; + gboolean state; gtk_tree_model_get (getModel(), &iter, column, &state, -1); - gtk_list_store_set (getStore(), &iter, column, !state, -1); + state = !state; + gtk_list_store_set (GTK_LIST_STORE (getModel()), &iter, column, state, -1); + ((YSelectionWidget *) m_ywidget)->selectItem (getItem (&iter), state); emitEvent (YEvent::ValueChanged); } static void selected_cb (GtkTreeView *tree_view, YGTableView* pThis) { IMPL - pThis->emitEvent (YEvent::SelectionChanged); + pThis->emitEvent (YEvent::SelectionChanged, true, true); } static void selected_delayed_cb (GtkTreeView *tree_view, YGTableView* pThis) @@ -282,64 +202,90 @@ class YGTable : public YTable, public YGTableView { public: - YGTable (const YWidgetOpt &opt, YGWidget *parent, - vector <string> headers) - : YTable (opt, headers.size()), - YGTableView (this, parent, opt, YCPString("")) + YGTable (YWidget *parent, YTableHeader *_header) + : YTable (NULL, _header) + , YGTableView (this, parent, string(), false, false) { IMPL + gtk_tree_view_set_headers_visible (getView(), TRUE); + gtk_tree_view_set_rules_hint (getView(), columns() > 1); + vector <GType> types; - types.assign (numCols(), G_TYPE_STRING); - initModel (types, true); - for (int i = 0; i < numCols(); i++) - insertColumn (i, headers[i], types[i]); - - setLabelVisible (false); - - if (!opt.keepSorting.value()) - YGUtils::tree_view_set_sortable (GTK_TREE_VIEW (getWidget()), 0); - if (numCols() >= 3) - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (getWidget()), TRUE); + for (int i = 0; i < columns(); i++) { + types.push_back (GDK_TYPE_PIXBUF); + types.push_back (G_TYPE_STRING); + } + createModel (types); + for (int i = 0; i < columns(); i++) + addColumn (YGTK_TYPE_CELL_RENDERER_TEXT_PIXBUF, + header (i), alignment (i), i*2); + gtk_tree_view_set_model (getView(), getModel()); g_signal_connect (G_OBJECT (getWidget()), "row-activated", G_CALLBACK (activated_cb), (YGTableView*) this); - if (opt.immediateMode.value()) + if (immediateMode()) g_signal_connect (G_OBJECT (getWidget()), "cursor-changed", G_CALLBACK (selected_cb), (YGTableView*) this); + setSortable (true); } - virtual void itemAdded (vector<string> elements, int index) + virtual void setKeepSorting (bool keepSorting) { - IMPL - addRow (index); - for (unsigned int c = 0; c < elements.size(); c++) - setItemText (elements[c], index, c); - - // always have one row selected - if (getCurrentRow() == -1) - setCurrentRow (index); + setSortable (keepSorting); + YTable::setKeepSorting (keepSorting); } - virtual void itemsCleared() - { IMPL; deleteRows(); } + virtual void addItem (YItem *_item) + { + YTableItem *item = dynamic_cast <YTableItem *> (_item); + if (item) { + GtkTreeIter iter; + addRow (&iter, _item); + for (int i = 0; i < columns(); i++) + setCell (&iter, item->cell (i)); + } + else + y2error ("Can only add YTableItems to a YTable."); + YTable::addItem (_item); + } - virtual void cellChanged (int index, int colnum, const YCPString& text) - { IMPL; setItemText (text->value(), index, colnum); } + virtual void cellChanged (const YTableCell *cell) + { + GtkTreeIter iter; + if (getIter (cell->parent(), &iter)) + setCell (&iter, cell); + } - virtual int getCurrentItem() - { IMPL; return getCurrentRow(); } + void setCell (GtkTreeIter *iter, const YTableCell *cell) + { + int index = cell->column() * 2; + setCellIcon (iter, index, cell->iconName()); + setCellLabel (iter, index+1, cell->label()); + } - virtual void setCurrentItem (int index) - { IMPL; setCurrentRow (index); } + void setSortable (bool sortable) + { + IMPL + int n = 0; + GList *columns = gtk_tree_view_get_columns (getView()); + for (GList *i = columns; i; i = i->next, n++) { + GtkTreeViewColumn *column = (GtkTreeViewColumn *) i->data; + int index = (n*2)+1; + if (!sortable) + index = -1; + gtk_tree_view_column_set_sort_column_id (column, index); + } + g_list_free (columns); + } YGWIDGET_IMPL_COMMON + YGSELECTION_WIDGET_IMPL_CLEAR (YTable) + YGSELECTION_WIDGET_IMPL_SELECT (YTable) }; -YWidget * -YGUI::createTable (YWidget *parent, YWidgetOpt & opt, - vector<string> headers) +YTable *YGWidgetFactory::createTable (YWidget *parent, YTableHeader *header) { - return new YGTable (opt, YGWidget::get (parent), headers); + return new YGTable (parent, header); } #include "YSelectionBox.h" @@ -347,67 +293,28 @@ class YGSelectionBox : public YSelectionBox, public YGTableView { public: - YGSelectionBox (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &label) - : YSelectionBox (opt, label), - YGTableView (this, parent, opt, label) + YGSelectionBox (YWidget *parent, const string &label) + : YSelectionBox (NULL, label), + YGTableView (this, parent, label, true, false) { - /* we'll have to wait for 09 to get nicer to construct vectors :P */ - vector <GType> types; - types.push_back (GDK_TYPE_PIXBUF); - types.push_back (G_TYPE_STRING); - initModel (types, false); - - insertColumn (1, "", G_TYPE_STRING); - setSearchCol (1); - // pixbuf column will be added later, if needed - g_signal_connect (G_OBJECT (getWidget()), "row-activated", G_CALLBACK (activated_cb), (YGTableView*) this); - if (opt.immediateMode.value()) + if (immediateMode()) g_signal_connect (G_OBJECT (getWidget()), "cursor-changed", G_CALLBACK (selected_cb), (YGTableView*) this); else g_signal_connect (G_OBJECT (getWidget()), "cursor-changed", - G_CALLBACK (selected_delayed_cb), (YGTableView*) this); + G_CALLBACK (selected_delayed_cb), (YGTableView*) this); } - // YSelectionBox - virtual int getCurrentItem() - { IMPL; return getCurrentRow(); } - - virtual void setCurrentItem (int index) - { IMPL; setCurrentRow (index); } - - // YSelectionWidget - virtual void itemAdded (const YCPString &str, int index, bool selected) - { - IMPL - addRow (index); - - if (hasIcons()) { - if (m_colsNb == 1) // make space for pixbufs - insertColumn (0, "", GDK_TYPE_PIXBUF); - setItemIcon (itemIcon (index)->value(), index, 0); - } - setItemText (str->value(), index, 1); - - if (selected) - setCurrentRow (index); - } - - virtual void deleteAllItems() - { IMPL; deleteRows(); } - YGWIDGET_IMPL_COMMON + YGSELECTION_WIDGET_IMPL_ALL (YSelectionBox) }; -YWidget * -YGUI::createSelectionBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label) +YSelectionBox *YGWidgetFactory::createSelectionBox (YWidget *parent, const string &label) { IMPL - return new YGSelectionBox (opt, YGWidget::get (parent), label); + return new YGSelectionBox (parent, label); } #include "YMultiSelectionBox.h" @@ -415,21 +322,19 @@ class YGMultiSelectionBox : public YMultiSelectionBox, public YGTableView { public: - YGMultiSelectionBox (const YWidgetOpt &opt, YGWidget *parent, - const YCPString &label) - : YMultiSelectionBox (opt, label), - YGTableView (this, parent, opt, label) + YGMultiSelectionBox (YWidget *parent, const string &label) + : YMultiSelectionBox (NULL, label), + YGTableView (this, parent, label, false, false) { vector <GType> types; types.push_back (G_TYPE_BOOLEAN); types.push_back (GDK_TYPE_PIXBUF); types.push_back (G_TYPE_STRING); - initModel (types, false); - - insertColumn (0, "", G_TYPE_BOOLEAN); - insertColumn (2, "", G_TYPE_STRING); - setSearchCol (2); - // pixbuf column will be added later, if needed + createModel (types); + addColumn (G_TYPE_BOOLEAN, "", YAlignUnchanged, 0); + addColumn (GDK_TYPE_PIXBUF, "", YAlignUnchanged, 1); + addColumn (G_TYPE_STRING, "", YAlignUnchanged, 2); + gtk_tree_view_set_model (getView(), getModel()); g_signal_connect (G_OBJECT (getWidget()), "cursor-changed", G_CALLBACK (selected_cb), (YGTableView*) this); @@ -439,85 +344,115 @@ } // YMultiSelectionBox - virtual int getCurrentItem() - { IMPL; return getCurrentRow(); } - - virtual void setCurrentItem (int index) - { IMPL; setCurrentRow (index); } + virtual void addItem (YItem *item) + { + GtkTreeIter iter; + addRow (&iter, item); + setCellToggle (&iter, 0, item->selected()); + setCellIcon (&iter, 1, item->iconName()); + setCellLabel (&iter, 2, item->label()); + YMultiSelectionBox::addItem (item); + } - // YSelectionWidget - virtual void itemAdded (const YCPString &str, int index, bool selected) + virtual void selectItem (YItem *item, bool select) { - IMPL - addRow (index); + GtkTreeIter iter; + if (getIter (item, &iter)) + setCellToggle (&iter, 0, select); + YMultiSelectionBox::selectItem (item); + } - if (hasIcons()) { - if (m_colsNb == 2) // make space for pixbufs - insertColumn (1, "", GDK_TYPE_PIXBUF); - setItemIcon (itemIcon (index)->value(), index, 1); + virtual void deselectAllItems() + { + GtkTreeIter iter; + if (gtk_tree_model_get_iter_first (getModel(), &iter)) { + do { + setCellToggle (&iter, 0, false); + } while (gtk_tree_model_iter_next (getModel(), &iter)); } - setItemBool (selected, index, 0); - setItemText (str->value(), index, 2); + YMultiSelectionBox::deselectAllItems(); } - virtual void deleteAllItems() - { IMPL; deleteRows(); } + virtual YItem *currentItem() + { return focusItem(); } - // Toggle related methods follow - /* Returns the state of the toggle at the row "index". - Pass -1 for query only. 0 and 1 to set it false or true. */ - bool itemSelected (int id, int state) - { - IMPL - GtkTreeIter iter; - if (!getRowOf (&iter, id)) - throw "Row doesn't exist"; + virtual void setCurrentItem (YItem *item) + { implFocusItem (item); } - if (state != -1) - gtk_list_store_set (getStore(), &iter, 0, state, -1); - gtk_tree_model_get (getModel(), &iter, 0, &state, -1); - return state; + virtual void setFocusItem (GtkTreeIter *iter, bool addingRow) + { + // item->selected() doesn't apply to focus, filter them + if (!addingRow) + YGTableView::setFocusItem (iter, addingRow); } - virtual bool itemIsSelected (int index) + // Events + static void multi_activated_cb (GtkTreeView *tree_view, GtkTreePath *path, + GtkTreeViewColumn *column, YGMultiSelectionBox* pThis) { IMPL - bool state = 0; - try { state = itemSelected (index, -1); } - catch (char *str) { y2error ("%s - itemIsSelected(%d): %s - ignoring", - YMultiSelectionBox::widgetClass(), index, str); } - return state; + pThis->toggle (path, 0); + } + + YGWIDGET_IMPL_COMMON + YGSELECTION_WIDGET_IMPL_CLEAR (YMultiSelectionBox) +}; + +YMultiSelectionBox *YGWidgetFactory::createMultiSelectionBox (YWidget *parent, + const string &label) +{ + IMPL + return new YGMultiSelectionBox (parent, label); +} + +#include "YTree.h" + +class YGTree : public YTree, public YGTableView +{ +public: + YGTree (YWidget *parent, const string &label) + : YTree (NULL, label) + , YGTableView (this, parent, label, true, true) + { + g_signal_connect (G_OBJECT (getWidget()), "row-activated", + G_CALLBACK (activated_cb), (YGTableView*) this); + g_signal_connect (G_OBJECT (getWidget()), "cursor-changed", + G_CALLBACK (selected_cb), (YGTableView*) this); } - virtual void selectItem (int index) + // YTree + virtual void rebuildTree() { - IMPL - try { itemSelected (index, 1); } - catch (char *str) { y2error ("%s - selectItem(%d): %s - ignoring", - YMultiSelectionBox::widgetClass(), index, str); } + doDeleteAllItems(); + for (YItemConstIterator it = itemsBegin(); it != itemsEnd(); it++) + doAddItem (*it); } - virtual void deselectAllItems() + virtual const YTreeItem *getCurrentItem() const { - for (int i = 0; ; i++) - try { itemSelected (i, false); } - catch (...) { break; } + YGTree *pThis = const_cast <YGTree *> (this); + return (YTreeItem *) pThis->focusItem(); } - static void multi_activated_cb (GtkTreeView *tree_view, GtkTreePath *path, - GtkTreeViewColumn *column, YGMultiSelectionBox* pThis) + virtual void setCurrentItem (YTreeItem *item) + { implFocusItem ((YItem *) item); } + + // YGSelectionModel + virtual void expand (GtkTreeIter *iter) { - IMPL - pThis->toggle (path, 0); + GtkTreePath *path = gtk_tree_model_get_path (getModel(), iter); + gtk_tree_view_expand_to_path (getView(), path); + gtk_tree_path_free (path); } YGWIDGET_IMPL_COMMON + YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN (YTree) + YGSELECTION_WIDGET_IMPL_CLEAR (YTree) + YGSELECTION_WIDGET_IMPL_SELECT (YTree) }; -YWidget * -YGUI::createMultiSelectionBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label) +YTree *YGWidgetFactory::createTree (YWidget *parent, const string &label) { - IMPL - return new YGMultiSelectionBox (opt, YGWidget::get (parent), label); + return new YGTree (parent, label); } + Modified: trunk/gtk/src/YGUI.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUI.cc?rev=43216&r1=4321... ============================================================================== --- trunk/gtk/src/YGUI.cc (original) +++ trunk/gtk/src/YGUI.cc Thu Dec 20 21:44:06 2007 @@ -6,11 +6,9 @@ #include <stdio.h> #include <ycp/y2log.h> #include <YEvent.h> -#include <YDialog.h> #include <YMacroRecorder.h> #include "YGUI.h" #include "YGUtils.h" -#include "YGWidget.h" #include "YGDialog.h" #include <glib/gthread.h> #include <sys/stat.h> @@ -19,14 +17,8 @@ #define DEFAULT_MACRO_FILE_NAME "macro.ycp" #define BUSY_CURSOR_TIMEOUT 250 -YGUI::YGUI (int argc, char ** argv, - bool with_threads, - const char *macro_file) : - YUI (with_threads), - busy_timeout (0), - m_done_init (false), - m_argc (0), - m_argv (NULL) +YGUI::YGUI (int argc, char **argv, bool with_threads, const char *macro_file) + : YUI (with_threads), busy_timeout (0), m_done_init (false), m_argc (0), m_argv (NULL) { IMPL m_have_wm = true; @@ -102,10 +94,8 @@ g_free (m_argv); } -static gboolean -ycp_wakeup_fn (GIOChannel *source, - GIOCondition condition, - gpointer data) +static gboolean ycp_wakeup_fn (GIOChannel *source, GIOCondition condition, + gpointer data) { *(int *)data = TRUE; return TRUE; @@ -119,10 +109,14 @@ } } -void -YGUI::idleLoop (int fd_ycp) +//#define PRINT_EVENTS + +void YGUI::idleLoop (int fd_ycp) { IMPL +#ifdef PRINT_EVENTS +fprintf (stderr, "idleLoop()\n"); +#endif // The rational for this is that we need somewhere to run // the magic 'main' thread, that can process thread unsafe // incoming CORBA messages for us @@ -141,6 +135,9 @@ g_source_remove (watch_tag); g_io_channel_unref (wakeup); +#ifdef PRINT_EVENTS +fprintf (stderr, "no more idle\n"); +#endif } static gboolean user_input_timeout_cb (YGUI *pThis) @@ -151,19 +148,20 @@ return FALSE; } -void -YGUI::sendEvent (YEvent *event) +void YGUI::sendEvent (YEvent *event) { m_event_handler.sendEvent (event); g_main_context_wakeup (NULL); } // utility that implements both userInput() and pollInput() -YEvent * -YGUI::waitInput (unsigned long timeout_ms, bool block) +YEvent *YGUI::waitInput (unsigned long timeout_ms, bool block) { IMPL - if (!currentYGDialog()) +#ifdef PRINT_EVENTS +fprintf (stderr, "%s()\n", block ? "userInput" : "pollInput"); +#endif + if (!YDialog::currentDialog (false)) return NULL; if (block) @@ -193,69 +191,61 @@ if (block) // if YCP keeps working for more than X time, set busy cursor busy_timeout = g_timeout_add (BUSY_CURSOR_TIMEOUT, busy_timeout_cb, this); +#ifdef PRINT_EVENTS +fprintf (stderr, "returning event: %s\n", !event ? "(none)" : YEvent::toString (event->eventType())); +#endif return event; } -YEvent * -YGUI::userInput (unsigned long timeout_ms) -{ - return waitInput (timeout_ms, true); -} +YEvent *YGUI::userInput (unsigned long timeout_ms) +{ return waitInput (timeout_ms, true); } YEvent *YGUI::pollInput() -{ - return waitInput (0, false); -} +{ return waitInput (0, false); } -// dialog bits - -static GdkScreen *getScreen () -{ - return gdk_display_get_default_screen (gdk_display_get_default()); -} +static inline GdkScreen *getScreen () +{ return gdk_display_get_default_screen (gdk_display_get_default()); } int YGUI::getDisplayWidth() -{ - IMPL - return gdk_screen_get_width (getScreen()); -} +{ return gdk_screen_get_width (getScreen()); } int YGUI::getDisplayHeight() -{ - IMPL - return gdk_screen_get_height (getScreen()); -} +{ return gdk_screen_get_height (getScreen()); } -int YGUI::getDefaultSize (YUIDimension dim) -{ - if (dim == YD_HORIZ) { - if (!m_default_size.width) { - if (m_fullscreen) - m_default_size.width = getDisplayWidth(); - else - m_default_size.width = MIN (600, getDisplayWidth()); - } - return m_default_size.width; - } - else { // YD_VERT - if (!m_default_size.height) { - if (m_fullscreen) - m_default_size.height = getDisplayHeight(); - else - m_default_size.height = MIN (450, getDisplayHeight()); - } - return m_default_size.height; - } +int YGUI::getDisplayDepth() +{ return gdk_visual_get_best_depth(); } + +long YGUI::getDisplayColors() +{ return 1L << getDisplayDepth(); /*from yast-qt*/ } + +// YCP writers use getDefaultWidth/Height() to do space saving if needed, +// so just tell me the displayWidth/Height(). If that size is decent, let's +// us deal with it. +int YGUI::getDefaultWidth() { return getDisplayWidth(); } +int YGUI::getDefaultHeight() { return getDisplayHeight(); } + +int YGUI::_getDefaultWidth() +{ + if (!m_default_size.width) + m_default_size.width = MIN (600, getDisplayWidth()); + return m_default_size.width; +} + +int YGUI::_getDefaultHeight() +{ + if (!m_default_size.height) + m_default_size.height = MIN (450, getDisplayHeight()); + return m_default_size.height; } // YWidget layout units -> pixels conversion. Same as yast-qt's. -long YGUI::deviceUnits (YUIDimension dim, float size) +int YGUI::deviceUnits (YUIDimension dim, float size) { if (dim == YD_HORIZ) return (long) ((size * (640.0/80)) + 0.5); else return (long) ((size * (480.0/25)) + 0.5); } -float YGUI::layoutUnits (YUIDimension dim, long device_units) +float YGUI::layoutUnits (YUIDimension dim, int device_units) { float size = (float) device_units; if (dim == YD_HORIZ) return size * (80/640.0); @@ -274,7 +264,7 @@ void YGUI::internalError (const char *msg) { errorMsg (msg); - abort(); // going down + abort(); // going down } /* File/directory dialogs. */ @@ -287,9 +277,9 @@ IMPL GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new (title->value_cstr(), - YGUI::ui()->currentWindow(), action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - action == GTK_FILE_CHOOSER_ACTION_SAVE ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); + YGDialog::currentWindow(), action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + action == GTK_FILE_CHOOSER_ACTION_SAVE ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, + GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), TRUE); // Yast likes to pass the path and suggested filename as a whole. We will need to @@ -383,15 +373,6 @@ return askForFileOrDirectory (GTK_FILE_CHOOSER_ACTION_SAVE, path, filter, title); } -bool YGUI::textMode() IMPL_RET(false) -bool YGUI::hasImageSupport() IMPL_RET(true) -bool YGUI::hasLocalImageSupport() IMPL_RET(true) -bool YGUI::hasAnimationSupport() IMPL_RET(true) -bool YGUI::hasIconSupport() IMPL_RET(true) -bool YGUI::hasFullUtf8Support() IMPL_RET(true) -bool YGUI::richTextSupportsTable() IMPL_RET(false) -bool YGUI::leftHandedMouse() IMPL_RET(false) - gboolean YGUI::busy_timeout_cb (gpointer data) { YGUI *pThis = (YGUI *) data; @@ -402,7 +383,7 @@ void YGUI::busyCursor() { - YGDialog *dialog = currentYGDialog(); + YGDialog *dialog = YGDialog::currentDialog(); if (dialog) dialog->busyCursor(); } @@ -414,42 +395,27 @@ busy_timeout = 0; } - YGDialog *dialog = currentYGDialog(); + YGDialog *dialog = YGDialog::currentDialog(); if (dialog) dialog->normalCursor(); } -void YGUI::redrawScreen() -{ - gtk_widget_queue_draw (GTK_WIDGET (currentWindow())); -} - YCPValue YGUI::runPkgSelection (YWidget *packageSelector) { - y2milestone ("Running package selection..."); - - // TODO: we may have to do some trickery here to disable close button - // and auto activate dialogs (whatever that is) -// _wm_close_blocked = true; -// _auto_activate_dialogs = false; - + y2milestone( "Running package selection..." ); YCPValue input = YCPVoid(); + try { input = evaluateUserInput(); - } - catch (const std::exception &e) { - y2error ("Caught std::exception: %s", e.what()); - y2error ("This is a libzypp problem. Do not file a bug against the UI!"); - } - catch (...) { - y2error ("Caught unspecified exception."); - y2error ("This is a libzypp problem. Do not file a bug against the UI!"); + } catch (const std::exception &e) { + y2error ("UI::RunPkgSelection() error: %s", e.what()); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } catch (...) { + y2error ("UI::RunPkgSelection() error (unspecified)"); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); } -// _auto_activate_dialogs = true; -// _wm_close_blocked = false; y2milestone ("Package selection done - returning %s", input->toString().c_str()); - return input; } @@ -458,7 +424,7 @@ IMPL bool interactive = filename.empty(); - GtkWidget *widget = GTK_WIDGET (currentWindow()); + GtkWidget *widget = GTK_WIDGET (YGDialog::currentWindow()); if (!widget) { if (interactive) errorMsg ("No dialog to take screenshot of."); @@ -542,7 +508,7 @@ if (recordingMacro()) { // save the taking of the screenshot and its name to the macro macroRecorder->beginBlock(); - currentDialog()->saveUserInput (macroRecorder); + YDialog::currentDialog()->saveUserInput (macroRecorder); macroRecorder->recordMakeScreenShot (true, filename.c_str()); macroRecorder->recordUserInput (YCPVoid()); macroRecorder->endBlock(); @@ -555,7 +521,7 @@ void YGUI::beep() { gdk_beep(); - GtkWindow *window = currentWindow(); + GtkWindow *window = YGDialog::currentWindow(); if (window) gtk_window_present (window); } @@ -642,7 +608,19 @@ } } -// debug dialogs +YGApplication::YGApplication() +{ + setIconBasePath (ICON_DIR); +} + +YWidgetFactory *YGUI::createWidgetFactory() +{ return new YGWidgetFactory; } +YOptionalWidgetFactory *YGUI::createOptionalWidgetFactory() +{ return new YGOptionalWidgetFactory; } +YApplication *YGUI::createApplication() +{ return new YGApplication(); } + +//** debug dialogs //#define IS_VALID_COL void dumpYastTree (YWidget *widget) @@ -659,10 +637,9 @@ GtkTreeIter iter; gtk_tree_store_append (store, &iter, parent_node); - YContainerWidget *container = dynamic_cast <YContainerWidget *> (widget); gchar *stretch = g_strdup_printf ("%d x %d", - ygwidget->isStretchable (YD_HORIZ), ygwidget->isStretchable (YD_VERT)); - gchar *weight = g_strdup_printf ("%ld x %ld", + widget->stretchable (YD_HORIZ), widget->stretchable (YD_VERT)); + gchar *weight = g_strdup_printf ("%d x %d", widget->weight (YD_HORIZ), widget->weight (YD_VERT)); gtk_tree_store_set (store, &iter, 0, widget->widgetClass(), 1, ygwidget->getDebugLabel().c_str(), 2, stretch, 3, weight, @@ -673,9 +650,9 @@ g_free (stretch); g_free (weight); - if (container) - for (int i = 0; i < container->numChildren(); i++) - dumpYastTree (container->child (i), store, &iter); + for (YWidgetListConstIterator it = widget->childrenBegin(); + it != widget->childrenEnd(); it++) + dumpYastTree (*it, store, &iter); } static void dialog_response_cb (GtkDialog *dialog, gint response, YWidget *ywidget) { @@ -765,7 +742,7 @@ YRichText *rtext = dynamic_cast <YRichText *> (widget); if (rtext) { - std::string text = rtext->getText()->value(); + std::string text = rtext->text(); char *xml = ygutils_convert_to_xhmlt_and_subst (text.c_str(), NULL); GtkWidget *view = gtk_text_view_new(); @@ -786,10 +763,9 @@ g_free (xml); } - YContainerWidget *container = dynamic_cast <YContainerWidget *> (widget); - if (container) - for (int i = 0; i < container->numChildren(); i++) - dumpYastHtml (container->child (i), box); + for (YWidgetListConstIterator it = widget->childrenBegin(); + it != widget->childrenEnd(); it++) + dumpYastHtml (*it, box); } static void destroy_dialog (GtkDialog *dialog, gint arg) { gtk_widget_destroy (GTK_WIDGET (dialog)); } Modified: trunk/gtk/src/YGUI.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUI.h?rev=43216&r1=43215... ============================================================================== --- trunk/gtk/src/YGUI.h (original) +++ trunk/gtk/src/YGUI.h Thu Dec 20 21:44:06 2007 @@ -7,10 +7,8 @@ #include <gtk/gtk.h> #include <YSimpleEventHandler.h> -#include <YUI.h> -using std::string; -using std::vector; +#define ICON_DIR THEMEDIR "/icons/22x22/apps/" /* Comment the following line to disable debug messages */ // #define IMPL_DEBUG @@ -20,13 +18,10 @@ #else #define IMPL { } #endif -#define IMPL_NULL { IMPL; return NULL; } -#define IMPL_VOID { IMPL; return YCPVoid(); } #define IMPL_RET(a) { IMPL; return (a); } -#define ICON_DIR THEMEDIR "/icons/22x22/apps/" - /* Compatibility */ +/* #if YAST2_VERSION > 2014004 # define YAST2_YGUI_CHECKBOX_FRAME 1 #elif YAST2_VERSION >= 2014000 @@ -36,9 +31,12 @@ #else # define YAST2_YGUI_CHECKBOX_FRAME 0 #endif +*/ class YGDialog; +#include <YUI.h> + class YGUI: public YUI { public: @@ -46,233 +44,56 @@ bool with_threads, const char *macro_file); virtual ~YGUI(); - static YGUI *ui() { return (YGUI *)YUI::ui(); } - - // non abstract loop bits: - virtual void blockEvents (bool block = true) IMPL - virtual bool eventsBlocked() const IMPL_RET (false) - virtual void internalError (const char *msg); - virtual void idleLoop (int fd_ycp); - virtual YEvent * waitInput (unsigned long timeout_ms, bool block); - virtual YEvent * userInput (unsigned long timeout_millisec); - virtual YEvent * pollInput(); - - virtual void showDialog (YDialog *dialog); - virtual void closeDialog (YDialog *dialog); - // Non abstract virtuals: - virtual YCPValue setLanguage (const YCPTerm & term) IMPL_VOID + static YGUI *ui() { return (YGUI *) YUI::ui(); } - // event pieces: - private: - YSimpleEventHandler m_event_handler; - public: - void sendEvent (YEvent *event); - YEvent *pendingEvent() const { return m_event_handler.pendingEvent(); } - bool eventPendingFor (YWidget *widget) const { return m_event_handler.eventPendingFor (widget); } +protected: + virtual YWidgetFactory *createWidgetFactory(); + virtual YOptionalWidgetFactory *createOptionalWidgetFactory(); + virtual YApplication *createApplication(); - // container widgets - virtual YDialog *createDialog (YWidgetOpt &opt); - virtual YContainerWidget *createSplit (YWidget *parent, YWidgetOpt &opt, YUIDimension dimension); - virtual YContainerWidget *createReplacePoint (YWidget *parent, YWidgetOpt &opt); - virtual YContainerWidget *createAlignment (YWidget *parent, YWidgetOpt &opt, - YAlignmentType halign, - YAlignmentType valign); - virtual YContainerWidget *createSquash (YWidget *parent, YWidgetOpt &opt, - bool hsquash, bool vsquash); - virtual YContainerWidget *createRadioButtonGroup (YWidget *parent, YWidgetOpt &opt); - virtual YContainerWidget *createFrame (YWidget *parent, YWidgetOpt &opt, - const YCPString &label); -#if YAST2_YGUI_CHECKBOX_FRAME - virtual YContainerWidget *createCheckBoxFrame( YWidget *parent, YWidgetOpt & opt, const YCPString & label, bool checked ); -#endif - - // leaf widgets - virtual YWidget *createEmpty (YWidget *parent, YWidgetOpt &opt); - virtual YWidget *createSpacing (YWidget *parent, YWidgetOpt &opt, float size, - bool horizontal, bool vertical); - virtual YWidget *createLabel (YWidget *parent, YWidgetOpt &opt, - const YCPString &text); - virtual YWidget *createRichText (YWidget *parent, YWidgetOpt &opt, - const YCPString &text); - virtual YWidget *createLogView (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, int visibleLines, - int maxLines); - virtual YWidget *createPushButton (YWidget *parent, YWidgetOpt &opt, - const YCPString & label); - virtual YWidget *createMenuButton (YWidget *parent, YWidgetOpt &opt, - const YCPString & label); - virtual YWidget *createRadioButton (YWidget *parent, YWidgetOpt &opt, - YRadioButtonGroup *rbg, - const YCPString &label, bool checked); - virtual YWidget *createCheckBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, bool checked); - virtual YWidget *createTextEntry (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, const YCPString &text); - virtual YWidget *createMultiLineEdit (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - const YCPString &text); - virtual YWidget *createSelectionBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label); - virtual YWidget *createMultiSelectionBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label); - virtual YWidget *createComboBox (YWidget *parent, YWidgetOpt &opt, - const YCPString &label); - virtual YWidget *createTree (YWidget *parent, YWidgetOpt &opt, - const YCPString &label); - virtual YWidget *createTable (YWidget *parent, YWidgetOpt &opt, - std::vector<std::string> header); - virtual YWidget *createProgressBar (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - const YCPInteger &maxprogress, - const YCPInteger &progress); - virtual YWidget *createImage (YWidget *parent, YWidgetOpt &opt, - YCPByteblock imagedata, YCPString defaulttext); - virtual YWidget *createImage (YWidget *parent, YWidgetOpt &opt, - YCPString file_name, YCPString defaulttext); - virtual YWidget *createIntField (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, int minValue, - int maxValue, int initialValue); - - // Package selector - virtual YWidget *createPackageSelector (YWidget *parent, YWidgetOpt &opt, - const YCPString &floppyDevice); - virtual YWidget *createPkgSpecial (YWidget *parent, YWidgetOpt &opt, - const YCPString &subwidget); - virtual YCPValue runPkgSelection (YWidget *packageSelector); - -/* - // FIXME: do we need to implement these new bits ? - - // New package selector bits ... - bool hasPatternSelector(); - YWidget * createPatternSelector ( YWidget * parent, - YWidgetOpt & opt ); - - bool hasSimplePatchSelector(); - YWidget * createSimplePatchSelector( YWidget * parent, - YWidgetOpt & opt ); -*/ - - // Optional widgets - virtual YWidget *createDummySpecialWidget (YWidget *parent, YWidgetOpt &opt) - IMPL_NULL; - virtual bool hasDummySpecialWidget() { return false; } - - virtual YWidget *createDownloadProgress (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, - const YCPString &filename, - int expectedSize); - virtual bool hasDownloadProgress() { return true; } - - virtual YWidget *createBarGraph (YWidget *parent, YWidgetOpt &opt); - virtual bool hasBarGraph() { return true; } - - virtual YWidget *createColoredLabel (YWidget *parent, YWidgetOpt &opt, - YCPString label, YColor foreground, - YColor background, int margin); - virtual bool hasColoredLabel() { return true; } - - virtual YWidget *createDate (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, const YCPString &date); - virtual bool hasDate() { return true; } - - virtual YWidget *createTime (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, const YCPString &time); - virtual bool hasTime() { return true; } - - virtual YWidget *createDumbTab (YWidget *parent, YWidgetOpt &opt); - virtual bool hasDumbTab() { return true; } - - virtual YWidget *createMultiProgressMeter (YWidget *parent, YWidgetOpt &opt, - bool horizontal, const YCPList & maxValues); - virtual bool hasMultiProgressMeter() { return true; } - - virtual YWidget *createSlider (YWidget *parent, YWidgetOpt &opt, - const YCPString &label, int min, - int max, int initial); - virtual bool hasSlider() { return true; } - - virtual YWidget *createPartitionSplitter (YWidget *parent, - YWidgetOpt &opt, - int usedSize, - int totalFreeSize, - int newPartSize, - int minNewPartSize, - int minFreeSize, - const YCPString &usedLabel, - const YCPString &freeLabel, - const YCPString &newPartLabel, - const YCPString &freeFieldLabel, - const YCPString &newPartFieldLabel); - virtual bool hasPartitionSplitter() { return true; } - - virtual YWidget *createPatternSelector (YWidget *parent, YWidgetOpt &opt) IMPL_NULL; - virtual bool hasPatternSelector() { return false; } - - virtual YWidget *createWizard (YWidget *parent, - YWidgetOpt &opt, - const YCPValue &backButtonId, - const YCPString &backButtonLabel, - const YCPValue &abortButtonId, - const YCPString &abortButtonLabel, - const YCPValue &nextButtonId, - const YCPString &nextButtonLabel); - virtual bool hasWizard() { return true; } - - - virtual int getDisplayWidth(); - virtual int getDisplayHeight(); - // let's fool YWidgets here because it tries to be smart if our default - // dialog size is too small - virtual int getDefaultWidth() { return 10000; } - virtual int getDefaultHeight() { return 10000; } - // Dunno where this is used in practice, but these can be got by a YCP - // apps, so better implement them. - virtual int getDisplayDepth() { return 24; } - virtual long getDisplayColors() { return 256*256*256; } - - virtual long deviceUnits (YUIDimension dim, float size); - virtual float layoutUnits (YUIDimension dim, long device_units); - - virtual bool textMode(); - virtual bool hasImageSupport(); - virtual bool hasLocalImageSupport(); - virtual bool hasAnimationSupport(); - virtual bool hasIconSupport(); - virtual bool hasFullUtf8Support(); - virtual bool richTextSupportsTable(); - virtual bool leftHandedMouse(); - - virtual YCPString glyph (const YCPSymbol &glyph); - virtual void redrawScreen(); - - // convience function to be used rather than currentDialog() - // NULL if there is no dialog at the moment. - GtkWindow *currentWindow(); - YGDialog *currentYGDialog(); - - virtual void busyCursor(); - virtual void normalCursor(); - - guint busy_timeout; // for busy cursor - static gboolean busy_timeout_cb (gpointer data); - - virtual void beep(); - virtual void makeScreenShot (string filename); +public: + YEvent *waitInput (unsigned long timeout_ms, bool block); + virtual void idleLoop (int fd_ycp); + virtual YEvent *userInput (unsigned long timeout_millisec); + virtual YEvent *pollInput(); + + virtual void internalError (const char *msg); + + virtual int deviceUnits (YUIDimension dim, float layout_units); + virtual float layoutUnits (YUIDimension dim, int device_units); + virtual YCPString glyph (const YCPSymbol &glyphSymbol); + + virtual int getDisplayWidth(); + virtual int getDisplayHeight(); + virtual int getDisplayDepth(); + virtual long getDisplayColors(); + virtual int getDefaultWidth(); + virtual int getDefaultHeight(); + virtual bool textMode() IMPL_RET (false) + virtual bool hasImageSupport() IMPL_RET (true) + virtual bool hasLocalImageSupport() IMPL_RET (true) + virtual bool hasAnimationSupport() IMPL_RET (true) + virtual bool hasIconSupport() IMPL_RET (true) + virtual bool hasFullUtf8Support() IMPL_RET (true) + virtual bool richTextSupportsTable() IMPL_RET (false) + + virtual void showDialog (YDialog *dialog); + virtual void closeDialog (YDialog *dialog); + + virtual void busyCursor(); + virtual void normalCursor(); + + virtual void makeScreenShot (string filename); + virtual void beep(); + virtual YCPValue runPkgSelection (YWidget *packageSelector); + + virtual YCPValue askForExistingDirectory (const YCPString &startDir, + const YCPString &headline); + virtual YCPValue askForExistingFile (const YCPString &startWith, + const YCPString &filter, const YCPString &headline); + virtual YCPValue askForSaveFileName (const YCPString &startWith, + const YCPString & filter, const YCPString &headline); - /* File/directory dialogs. */ - virtual YCPValue askForExistingDirectory (const YCPString &startDir, - const YCPString &headline); - virtual YCPValue askForExistingFile (const YCPString &startWith, - const YCPString &filter, - const YCPString &headline); - virtual YCPValue askForSaveFileName (const YCPString &startWith, - const YCPString &filter, - const YCPString &headline); - - // Starts macro recording and asks for a filename to save it to - // If there is already one in progress, it just resumes/pauses as appropriate - // activated by Ctrl-Shift-Alt-M void toggleRecordMacro(); // Plays a macro, opening a dialog first to ask for the filename @@ -282,7 +103,16 @@ // On Shift-F8, run save_logs void askSaveLogs(); - private: + YSimpleEventHandler m_event_handler; + void sendEvent (YEvent *event); + YEvent *pendingEvent() const { return m_event_handler.pendingEvent(); } + bool eventPendingFor (YWidget *widget) const + { return m_event_handler.eventPendingFor (widget); } + +private: + guint busy_timeout; // for busy cursor + static gboolean busy_timeout_cb (gpointer data); + // window-related arguments bool m_have_wm, m_no_border, m_fullscreen; GtkRequisition m_default_size; @@ -297,10 +127,10 @@ map <string, int> screenShotNb; string screenShotNameTemplate; - public: +public: // Helpers for internal use [ visibility hidden ] - int getDefaultSize (YUIDimension dim); - bool setFullscreen() const { return m_fullscreen || !m_have_wm; } + int _getDefaultWidth(); int _getDefaultHeight(); + bool setFullscreen() const { return m_fullscreen; } bool hasWM() const { return m_have_wm; } bool unsetBorder() const { return m_no_border; } }; @@ -309,5 +139,105 @@ void dumpYastTree (YWidget *widget); void dumpYastHtml (YWidget *widget); -#endif // YGUI_H +#include <YWidgetFactory.h> + +class YGWidgetFactory : public YWidgetFactory +{ + virtual YDialog *createDialog (YDialogType dialogType, YDialogColorMode colorMode); + + virtual YPushButton *createPushButton (YWidget *parent, const string &label); + virtual YLabel *createLabel (YWidget *parent, const string &text, bool isHeading, bool isOutputField); + virtual YInputField *createInputField (YWidget *parent, const string &label, bool passwordMode); + virtual YCheckBox *createCheckBox (YWidget *parent, const string &label, bool isChecked); + virtual YRadioButton *createRadioButton (YWidget *parent, const string &label, bool isChecked); + virtual YComboBox *createComboBox (YWidget * parent, const string & label, bool editable); + virtual YSelectionBox *createSelectionBox (YWidget *parent, const string &label); + virtual YTree *createTree (YWidget *parent, const string &label); + virtual YTable *createTable (YWidget * parent, YTableHeader *header); + virtual YProgressBar *createProgressBar (YWidget *parent, const string &label, int maxValue); + virtual YRichText *createRichText (YWidget *parent, const string &text, bool plainTextMode); + + virtual YIntField *createIntField (YWidget *parent, const string &label, int minVal, int maxVal, int initialVal); + virtual YMenuButton *createMenuButton (YWidget *parent, const string &label); + virtual YMultiLineEdit *createMultiLineEdit (YWidget *parent, const string &label); + virtual YImage *createImage (YWidget *parent, const string &imageFileName, bool animated); + virtual YLogView *createLogView (YWidget *parent, const string &label, int visibleLines, int storedLines); + virtual YMultiSelectionBox *createMultiSelectionBox (YWidget *parent, const string &label); + + virtual YPackageSelector *createPackageSelector (YWidget * parent, long ModeFlags); + virtual YWidget *createPkgSpecial (YWidget * parent, const string & subwidgetName) + IMPL_RET (NULL) // for ncurses + + virtual YLayoutBox *createLayoutBox (YWidget *parent, YUIDimension dimension); + + virtual YSpacing *createSpacing (YWidget *parent, YUIDimension dim, bool stretchable, YLayoutSize_t size); + virtual YEmpty *createEmpty (YWidget *parent); + virtual YAlignment *createAlignment (YWidget *parent, YAlignmentType horAlignment, YAlignmentType vertAlignment); + virtual YSquash *createSquash (YWidget *parent, bool horSquash, bool vertSquash); + + virtual YFrame *createFrame (YWidget *parent, const string &label); + virtual YCheckBoxFrame *createCheckBoxFrame (YWidget *parent, const string &label, bool checked); + + virtual YRadioButtonGroup *createRadioButtonGroup (YWidget *parent); + virtual YReplacePoint *createReplacePoint (YWidget *parent); +}; + +#include <YOptionalWidgetFactory.h> + +class YGOptionalWidgetFactory : public YOptionalWidgetFactory +{ +public: + virtual bool hasWizard() IMPL_RET (true) + virtual YWizard *createWizard (YWidget *parent, const string &backButtonLabel, + const string &abortButtonLabel, const string &nextButtonLabel, + YWizardMode wizardMode); + + virtual bool hasDumbTab() IMPL_RET (true) + virtual YDumbTab *createDumbTab (YWidget *parent); + + virtual bool hasSlider() IMPL_RET (true) + virtual YSlider *createSlider (YWidget *parent, const string &label, int minVal, + int maxVal, int initialVal); + + virtual bool hasDateField() IMPL_RET (true) + virtual YDateField *createDateField (YWidget *parent, const string &label); + + virtual bool hasTimeField() IMPL_RET (true) + virtual YTimeField *createTimeField (YWidget *parent, const string &label); + + virtual bool hasBarGraph() IMPL_RET (true) + virtual YBarGraph *createBarGraph (YWidget *parent); + + virtual bool hasMultiProgressMeter() IMPL_RET (true) + virtual YMultiProgressMeter *createMultiProgressMeter (YWidget *parent, + YUIDimension dim, const vector<float> &maxValues); + + virtual bool hasPartitionSplitter() IMPL_RET (true) + virtual YPartitionSplitter *createPartitionSplitter (YWidget *parent, + int usedSize, int totalFreeSize, int newPartSize, int minNewPartSize, + int minFreeSize, const string &usedLabel, const string &freeLabel, + const string &newPartLabel, const string &freeFieldLabel, + const string &newPartFieldLabel); + + virtual bool hasDownloadProgress() IMPL_RET (true) + virtual YDownloadProgress *createDownloadProgress (YWidget *parent, + const string &label, const string & filename, YFileSize_t expectedFileSize); + + virtual bool hasSimplePatchSelector() IMPL_RET (false) + virtual YWidget *createSimplePatchSelector (YWidget *parent, long modeFlags) + IMPL_RET (NULL) + virtual bool hasPatternSelector() IMPL_RET (false) + virtual YWidget *createPatternSelector (YWidget *parent, long modeFlags) + IMPL_RET (NULL) +}; + +#include <YApplication.h> + +class YGApplication : public YApplication +{ +public: + YGApplication(); +}; + +#endif /*YGUI_H*/ Modified: trunk/gtk/src/YGUtils.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUtils.cc?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGUtils.cc (original) +++ trunk/gtk/src/YGUtils.cc Thu Dec 20 21:44:06 2007 @@ -3,16 +3,16 @@ ********************************************************************/ #include <config.h> -#include <YGUI.h> +#include <ycp/y2log.h> +#include "YGUI.h" #include "YGUtils.h" -string YGUtils::mapKBAccel (const char *src) +string YGUtils::mapKBAccel (const string &src) { // we won't use use replace since we also want to escape _ to __ + int length = src.length(); string str; - int length = strlen (src); str.reserve (length); - for (int i = 0; i < length; i++) { if (src[i] == '_') str += "__"; @@ -24,46 +24,46 @@ return str; } -string YGUtils::filterText (const char* text, int length, const char *valid_chars) +void YGUtils::setFilter (GtkEntry *entry, const string &validChars) { - if (length == -1) - length = strlen (text); - if (valid_chars[0] == '\0') - return string(text); - - string str; - str.reserve (length); - for (int i = 0; text[i] && i < length; i++) { - for (int j = 0; valid_chars[j]; j++) - if(text[i] == valid_chars[j]) { - str += text[i]; - break; + struct inner { + static void insert_text_cb (GtkEditable *editable, const gchar *new_text, + gint new_text_length, gint *pos) + { + const gchar *valid_chars = (gchar *) g_object_get_data (G_OBJECT (editable), + "valid-chars"); + if (valid_chars) { + const gchar *i, *j; + for (i = new_text; *i; i++) { + for (j = valid_chars; *j; j++) { + if (*i == *j) + break; + } + if (!*j) { + // not valid text + g_signal_stop_emission_by_name (editable, "insert_text"); + gdk_beep(); + return; + } + } } - } - return str; -} - -void YGUtils::filterText (GtkEditable *editable, int pos, int length, - const char *valid_chars) -{ - gchar *text = gtk_editable_get_chars (editable, pos, pos + length); - string str = filterText (text, length, valid_chars); - if (length == -1) - length = strlen (text); - - if (str != text) { // invalid text - // delete current text - gtk_editable_delete_text (editable, pos, length); - // insert correct text - gtk_editable_insert_text (editable, str.c_str(), str.length(), &pos); + } + }; - g_signal_stop_emission_by_name (editable, "insert_text"); - gdk_beep(); // BEEP! + if (!validChars.empty()) { + gchar *chars = g_strdup (validChars.c_str()); + g_object_set_data_full (G_OBJECT (entry), "valid-chars", chars, g_free); + g_signal_connect (G_OBJECT (entry), "insert-text", + G_CALLBACK (inner::insert_text_cb), NULL); } - - g_free (text); + else + g_object_disconnect (G_OBJECT (entry), "insert-text", + G_CALLBACK (inner::insert_text_cb), NULL); } +void ygutils_setFilter (GtkEntry *entry, const char *validChars) +{ YGUtils::setFilter (entry, validChars); } + void YGUtils::replace (string &str, const char *mouth, int mouth_len, const char *food) { if (mouth_len < 0) @@ -460,151 +460,6 @@ return parts; } -void YGUtils::print_model (GtkTreeModel *model, int string_col) -{ - fprintf (stderr, "printing model...\n"); - int depth = 0; - GtkTreeIter iter; - - if (!gtk_tree_model_get_iter_first (model, &iter)) { - fprintf (stderr, "Couldn't even get a first iterator\n"); - return; - } - - while (true) - { - // print node - gchar *package_name = 0; - gtk_tree_model_get (model, &iter, string_col, &package_name, -1); - for (int i = 0; i < depth*4; i++) - fprintf (stderr, " "); - fprintf (stderr, "%s\n", package_name); - g_free (package_name); - - if (gtk_tree_model_iter_has_child (model, &iter)) { - GtkTreeIter parent = iter; - gtk_tree_model_iter_children (model, &iter, &parent); - depth++; - } - else { - if (gtk_tree_model_iter_next (model, &iter)) - ; // continue - else { - // let's see if there is a parent - GtkTreeIter child = iter; - if (gtk_tree_model_iter_parent (model, &iter, &child) && - gtk_tree_model_iter_next (model, &iter)) - depth--; - else - break; - } - } - } -} - -void YGUtils::tree_view_radio_toggle_cb (GtkCellRendererToggle *renderer, - gchar *path_str, GtkTreeModel *model) -{ - // Toggle the box - GtkTreePath *path = gtk_tree_path_new_from_string (path_str); - gint *column = (gint*) g_object_get_data (G_OBJECT (renderer), "column"); - GtkTreeIter iter; - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_path_free (path); - - // Disable radio buttons from the same parent - GtkTreeIter parent_iter, child_iter; - if (gtk_tree_model_iter_parent (model, &parent_iter, &iter) && - gtk_tree_model_iter_children (model, &child_iter, &parent_iter)) { - do gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter, column, FALSE, -1); - while (gtk_tree_model_iter_next (model, &child_iter)); - gtk_tree_store_set (GTK_TREE_STORE (model), &iter, column, TRUE, -1); - } -} - -gint YGUtils::sort_compare_cb (GtkTreeModel *model, GtkTreeIter *a, - GtkTreeIter *b, gpointer data) -{ - IMPL - gint col = GPOINTER_TO_INT (data); - gchar *str1 = 0, *str2 = 0; - gtk_tree_model_get (model, a, col, &str1, -1); - gtk_tree_model_get (model, b, col, &str2, -1); - gint cmp = 0; - if (str1 && str2) - cmp = YGUtils::strcmp (str1, str2); - - if (str1) - g_free (str1); - if (str2) - g_free (str2); - return cmp; -} - -static void header_clicked_cb (GtkTreeViewColumn *column, GtkTreeSortable *sortable) -{ - IMPL - GtkTreeViewColumn *last_sorted = - (GtkTreeViewColumn *) g_object_get_data (G_OBJECT (sortable), "last-sorted"); - int id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (column), "id")); - - GtkSortType sort = GTK_SORT_ASCENDING; - if (last_sorted != column) { - if (last_sorted) - gtk_tree_view_column_set_sort_indicator (last_sorted, FALSE); - gtk_tree_view_column_set_sort_indicator (column, TRUE); - g_object_set_data (G_OBJECT (sortable), "last-sorted", column); - } - else { - sort = gtk_tree_view_column_get_sort_order (column); - sort = sort == GTK_SORT_ASCENDING ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING; - } - - gtk_tree_view_column_set_sort_order (column, sort); - gtk_tree_sortable_set_sort_column_id (sortable, id, sort); -} - -void YGUtils::tree_view_set_sortable (GtkTreeView *view, int default_sort_col) -{ - IMPL - g_assert (gtk_tree_view_get_headers_visible (view)); - - /* Set all string columns clickable. */ - GtkTreeSortable *sortable = GTK_TREE_SORTABLE (gtk_tree_view_get_model (view)); - // we need a pointer, this function is used by different stuff, so to we'll - // use g_object_*_data() to do of garbage collector - g_object_set_data (G_OBJECT (sortable), "last-sorted", NULL); - - GList *columns = gtk_tree_view_get_columns (view); - for (GList *i = g_list_first (columns); i; i = i->next) { - GtkTreeViewColumn *column = (GtkTreeViewColumn *) i->data; - int col_nb = g_list_position (columns, i); - - // check if it really is a string column - bool string_col = false; - GList *renderers = gtk_tree_view_column_get_cell_renderers (column); - for (GList *j = g_list_first (renderers); j; j = j->next) - if (GTK_IS_CELL_RENDERER_TEXT (j->data)) { - string_col = true; - break; - } - g_list_free (renderers); - if (!string_col) - continue; - - // set sortable and clickable - gtk_tree_sortable_set_sort_func (sortable, col_nb, sort_compare_cb, - GINT_TO_POINTER (col_nb), NULL); - g_object_set_data (G_OBJECT (column), "id", GINT_TO_POINTER (col_nb)); - gtk_tree_view_column_set_clickable (column, TRUE); - g_signal_connect (G_OBJECT (column), "clicked", - G_CALLBACK (header_clicked_cb), sortable); - if (col_nb == default_sort_col) - header_clicked_cb (column, sortable); - } - g_list_free (columns); -} - GValue YGUtils::floatToGValue (float num) { GValue value = { 0 }; @@ -613,42 +468,17 @@ return value; } -#define SCROLLING_TIME 700 -#define SCROLLING_STEP 100 -struct ScrollData { - int orix, oriy, diffx, diffy, time; - GtkTreeView *view; -}; - -static gboolean scroll_timeout (gpointer _data) { - ScrollData *data = (ScrollData *) _data; - data->time += SCROLLING_STEP; - - int x = data->orix + data->diffx; - int y = ((data->diffy * data->time) / SCROLLING_TIME) + data->oriy; - - gtk_tree_view_scroll_to_point (data->view, x, y); - return data->time < SCROLLING_TIME; -} - -void YGUtils::tree_view_smooth_scroll_to_point (GtkTreeView *view, gint x, gint y) { - GdkRectangle rect; - gtk_tree_view_get_visible_rect (view, &rect); - if (rect.x == x && rect.y == y) - return; - - ScrollData *data = (ScrollData *) g_malloc (sizeof (ScrollData)); - data->orix = rect.x; - data->oriy = rect.y; - data->diffx = x - rect.x; - data->diffy = y - rect.y; - data->time = 0; - data->view = view; - - static int id = 0; - if (id) - g_source_remove (id); - id = g_timeout_add_full (G_PRIORITY_DEFAULT, SCROLLING_STEP, scroll_timeout, data, g_free); +GdkPixbuf *YGUtils::loadPixbuf (const string &filename) +{ + GdkPixbuf *pixbuf = NULL; + if (!filename.empty()) { + GError *error = 0; + pixbuf = gdk_pixbuf_new_from_file (filename.c_str(), &error); + if (!pixbuf) + y2warning ("Could not load icon: %s.\nReason: %s\n", + filename.c_str(), error->message); + } + return pixbuf; } #define ENGLISH_STOCK_ITEMS Modified: trunk/gtk/src/YGUtils.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUtils.h?rev=43216&r1=43... ============================================================================== --- trunk/gtk/src/YGUtils.h (original) +++ trunk/gtk/src/YGUtils.h Thu Dec 20 21:44:06 2007 @@ -8,7 +8,7 @@ #include <string> #include <list> #include <gtk/gtktextview.h> -#include <gtk/gtkeditable.h> +#include <gtk/gtkentry.h> #include <gtk/gtktreeview.h> #include <gtk/gtktreemodel.h> #include <gtk/gtkcellrenderertoggle.h> @@ -24,19 +24,10 @@ namespace YGUtils { /* Replaces Yast's '&' accelerator by Gnome's '_' (and proper escaping). */ - std::string mapKBAccel (const char *src); + std::string mapKBAccel (const std::string &src); - /* Filters characters that are not on the valids_chars array from the text string - Length is used to tell the length of text, in case it isn't NUL - terminated (you may pass -1, if it is). - Use the compare string member if you want to see if there was any change. */ - std::string filterText (const char* text, int length, const char* valid_chars); - - /* Convenience call for widgets that implement GtkEditable interface. - This function inserts and deletes text, if needed, so you may want - to block those signals, if you have them set. */ - void filterText (GtkEditable *editable, int pos, int length, - const char *valid_chars); + /* Adds filter support to a GtkEntry. */ + void setFilter (GtkEntry *entry, const std::string &validChars); /* Replaces every 'mouth' by 'food' in 'str'. */ void replace (std::string &str, const char *mouth, int mouth_len, const char *food); @@ -65,27 +56,12 @@ eg: splitString ("Office/Writer", '/') => { "Office", "Writer" } */ std::list <std::string> splitString (const std::string &str, char separator); - /* Prints a GtkTreeModel for debugging purposes. */ - void print_model (GtkTreeModel *model, int string_col); - - /* To be used as a callback to sort tree views. */ - gint sort_compare_cb (GtkTreeModel *model, GtkTreeIter *a, - GtkTreeIter *b, gpointer data); - - /* To be used as a callback for a GtkTreeView with toggle cells. */ - void tree_view_radio_toggle_cb (GtkCellRendererToggle *renderer, - gchar *path_str, GtkTreeModel *model); - - /* Goes through all GtkTreeView columns and checks for TextCellRenderers, - setting those columns as sortable. */ - void tree_view_set_sortable (GtkTreeView *view, int default_sort_col); - - /* Like gtk_tree_view_scroll_to_point(), but does smooth scroll. */ - void tree_view_smooth_scroll_to_point (GtkTreeView *view, gint x, gint y); - /* Converts stuff to GValues */ GValue floatToGValue (float num); + GdkPixbuf *loadPixbuf (const std::string &fileneme); + + /* Tries to make sense out of the string, applying some stock icon to the button. */ void setStockIcon (GtkWidget *button, std::string ycp_str); }; @@ -94,6 +70,8 @@ int ygutils_getCharsHeight (GtkWidget *widget, int chars_nb); void ygutils_setWidgetFont (GtkWidget *widget, PangoWeight weight, double scale); + void ygutils_setFilter (GtkEntry *entry, const char *validChars); + /* Convert html to xhtml (or at least try) */ gchar *ygutils_convert_to_xhmlt_and_subst (const char *instr, const char *product); void ygutils_setStockIcon (GtkWidget *button, const char *ycp_str); Modified: trunk/gtk/src/YGWidget.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGWidget.cc?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/YGWidget.cc (original) +++ trunk/gtk/src/YGWidget.cc Thu Dec 20 21:44:06 2007 @@ -14,17 +14,17 @@ /* YGWidget follows */ -YGWidget::YGWidget(YWidget *y_widget, YGWidget *parent, bool show, +YGWidget::YGWidget(YWidget *ywidget, YWidget *yparent, bool show, GtkType type, const char *property_name, ...) - : m_y_widget (y_widget) + : m_ywidget (ywidget) { va_list args; va_start (args, property_name); - construct (y_widget, parent, show, type, property_name, args); + construct (ywidget, yparent, show, type, property_name, args); va_end (args); } -void YGWidget::construct (YWidget *y_widget, YGWidget *parent, bool _show, +void YGWidget::construct (YWidget *ywidget, YWidget *yparent, bool _show, GType type, const char *property_name, va_list args) { m_widget = GTK_WIDGET (g_object_new_valist (type, property_name, args)); @@ -38,19 +38,16 @@ gtk_container_add (GTK_CONTAINER (m_adj_size), m_widget); } - y_widget->setWidgetRep ((void *) this); - if (parent) - y_widget->setParent (parent->m_y_widget); - -#ifdef IMPL_DEBUG - fprintf (stderr, "Set YWidget %p rep to %p\n", y_widget, this); -#endif - // Split by two so that with another widget it will have full border... setBorder (DEFAULT_BORDER / 2); - if (_show) show(); + + ywidget->setWidgetRep ((void *) this); + if (yparent) { + ywidget->setParent (yparent); + yparent->addChild (ywidget); + } } YGWidget::~YGWidget() @@ -65,24 +62,14 @@ gtk_widget_show (m_widget); } -YGWidget *YGWidget::get (YWidget *y_widget) +YGWidget *YGWidget::get (YWidget *ywidget) { - if (!y_widget || !y_widget->widgetRep()) { -#ifdef IMPL_DEBUG - if (y_widget) - fprintf (stderr, "Widget '%s' (label: '%s') not supported\n", - y_widget->widgetClass(), y_widget->debugLabel().c_str()); - else - fprintf (stderr, "YGWidget::get() on null\n"); -#endif - return NULL; - } - return (YGWidget *) (y_widget->widgetRep()); + g_assert (ywidget->widgetRep() != NULL); + return (YGWidget *) ywidget->widgetRep(); } bool YGWidget::doSetKeyboardFocus() { - IMPL gtk_widget_grab_focus (GTK_WIDGET (getWidget())); return gtk_widget_is_focus (GTK_WIDGET (getWidget())); } @@ -92,6 +79,26 @@ gtk_widget_set_sensitive (getWidget(), enabled); } +void YGWidget::doAddChild (YWidget *ychild, GtkWidget *container) +{ + GtkWidget *child = YGWidget::get (ychild)->getLayout(); + gtk_container_add (GTK_CONTAINER (container), child); +} + +void YGWidget::doRemoveChild (YWidget *ychild, GtkWidget *container) +{ + /* Note: removeChild() is generally a result of a widget being removed as it + will remove itself from the parent. But YGWidget deconstructor would run + before the YWidget one, as that's the order we have been using, so we + can't use it, we can't retrieve the GTK widget then. However, this is a + non-issue, as ~YGWidget will destroy the widget, and GTK will remove it + from the parent. */ + if (!ychild->beingDestroyed()) { + GtkWidget *child = YGWidget::get (ychild)->getLayout(); + gtk_container_remove (GTK_CONTAINER (container), child); + } +} + void YGWidget::emitEvent(YEvent::EventReason reason, bool if_notify, bool if_not_pending, bool immediate) { @@ -106,14 +113,14 @@ } }; - if (!if_notify || m_y_widget->getNotify()) + if (!if_notify || m_ywidget->notify()) { if (!immediate) - g_timeout_add (250, inner::dispatchEvent, new YWidgetEvent (m_y_widget, reason)); - else if (!if_not_pending || !YGUI::ui()->eventPendingFor (m_y_widget)) + g_timeout_add (250, inner::dispatchEvent, new YWidgetEvent (m_ywidget, reason)); + else if (!if_not_pending || !YGUI::ui()->eventPendingFor (m_ywidget)) { if (immediate) - YGUI::ui()->sendEvent (new YWidgetEvent (m_y_widget, reason)); + YGUI::ui()->sendEvent (new YWidgetEvent (m_ywidget, reason)); } } } @@ -143,59 +150,18 @@ void YGWidget::sync_stretchable (YWidget *child) { IMPL - YWidget *parent = m_y_widget->yParent(); + YWidget *parent = m_ywidget->parent(); if (parent) - // tell parent to sync too! - YGWidget::get (parent)->sync_stretchable (m_y_widget); -} - -// JEEZ. WHEN the hell will yast-ui code fix their damn code. -#if 1 -/* Checks everywhere in a container to see if there are children (so - he is completely initialized) so that we may ask him for stretchable() - because some YContainerWidgets crash when they don't have children. */ -#include "YSplit.h" -static bool safe_stretchable (YWidget *widget) -{ - YContainerWidget *container = dynamic_cast <YContainerWidget *> (widget); - if (container) { - YSplit *split = dynamic_cast <YSplit *> (widget); - // in the case of YSplit its safe to ask for stretchability with no kids - if (split) { - if (!split->hasChildren()) - return true; - } - else - if (!container->hasChildren()) - return false; - - for (int i = 0; i < container->numChildren(); i++) - if (!safe_stretchable (container->child (i))) - return false; - } - return true; -} -#else -static bool safe_stretchable (YWidget *widget) -{ - return true; -} -#endif - -bool YGWidget::isStretchable (YUIDimension dim) -{ - if (safe_stretchable (m_y_widget)) - return m_y_widget->stretchable (dim); - return false; + YGWidget::get (parent)->sync_stretchable (m_ywidget); } /* YGLabeledWidget follows */ -YGLabeledWidget::YGLabeledWidget (YWidget *y_widget, YGWidget *parent, - YCPString label_text, YUIDimension label_ori, +YGLabeledWidget::YGLabeledWidget (YWidget *ywidget, YWidget *parent, + const std::string &label_text, YUIDimension label_ori, bool show, GType type, const char *property_name, ...) - : YGWidget (y_widget, parent, show, + : YGWidget (ywidget, parent, show, label_ori == YD_VERT ? GTK_TYPE_VBOX : GTK_TYPE_HBOX, "spacing", LABEL_WIDGET_SPACING, NULL) { @@ -237,12 +203,11 @@ gtk_label_set_mnemonic_widget (GTK_LABEL (m_label), widget); } -void YGLabeledWidget::doSetLabel (const YCPString &label) +void YGLabeledWidget::doSetLabel (const std::string &label) { - string str = YGUtils::mapKBAccel (label->value_cstr()); - if (str.empty()) { + string str = YGUtils::mapKBAccel (label); + if (str.empty()) gtk_widget_hide (m_label); - } else { gtk_widget_show (m_label); @@ -264,11 +229,11 @@ /* YGScrolledWidget follows */ #define MAX_SCROLL_WIDTH 120 -YGScrolledWidget::YGScrolledWidget (YWidget *y_widget, YGWidget *parent, +YGScrolledWidget::YGScrolledWidget (YWidget *ywidget, YWidget *parent, bool show, GType type, const char *property_name, ...) - : YGLabeledWidget (y_widget, parent, YCPString (""), YD_VERT, show, - YGTK_TYPE_SCROLLED_WINDOW, "shadow-type", GTK_SHADOW_IN, NULL) + : YGLabeledWidget (ywidget, parent, string(), YD_VERT, show, + YGTK_TYPE_TUNED_SCROLLED_WINDOW, "shadow-type", GTK_SHADOW_IN, NULL) { va_list args; va_start (args, property_name); @@ -278,12 +243,12 @@ setLabelVisible (false); } -YGScrolledWidget::YGScrolledWidget (YWidget *y_widget, YGWidget *parent, - YCPString label_text, YUIDimension label_ori, +YGScrolledWidget::YGScrolledWidget (YWidget *ywidget, YWidget *parent, + const std::string &label_text, YUIDimension label_ori, bool show, GType type, const char *property_name, ...) - : YGLabeledWidget (y_widget, parent, label_text, label_ori, show, - YGTK_TYPE_SCROLLED_WINDOW, "shadow-type", GTK_SHADOW_IN, NULL) + : YGLabeledWidget (ywidget, parent, label_text, label_ori, show, + YGTK_TYPE_TUNED_SCROLLED_WINDOW, "shadow-type", GTK_SHADOW_IN, NULL) { va_list args; va_start (args, property_name); @@ -306,7 +271,8 @@ { gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (YGLabeledWidget::getWidget()), hpolicy, vpolicy); - ygtk_scrolled_window_set_auto_policy (YGTK_SCROLLED_WINDOW (YGLabeledWidget::getWidget()), + ygtk_tuned_scrolled_window_set_auto_policy ( + YGTK_TUNED_SCROLLED_WINDOW (YGLabeledWidget::getWidget()), hpolicy == GTK_POLICY_AUTOMATIC ? MAX_SCROLL_WIDTH : 0, 0); } Modified: trunk/gtk/src/YGWidget.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGWidget.h?rev=43216&r1=4... ============================================================================== --- trunk/gtk/src/YGWidget.h (original) +++ trunk/gtk/src/YGWidget.h Thu Dec 20 21:44:06 2007 @@ -13,29 +13,29 @@ class YGWidget { public: - YGWidget(YWidget *y_widget, YGWidget *parent, bool show, + YGWidget(YWidget *ywidget, YWidget *yparent, bool show, GType type, const char *property_name, ...); virtual ~YGWidget(); virtual GtkWidget *getWidget() { return m_widget; } - const char *getWidgetName() const - { return const_cast <YWidget *> (m_y_widget)->widgetClass(); } - // YWidget::debugLabel() sucks for most widgets -- let's allow it to be overload - virtual string getDebugLabel() const - { // container debug labels are worse than useless - if (dynamic_cast <YContainerWidget *> (m_y_widget) == NULL) - return const_cast <YWidget *> (m_y_widget)->debugLabel(); return string(); } - void show(); - // containers should use this call rather than getWidget() GtkWidget *getLayout() { return m_adj_size; } // Get the YGWidget associated with a YWidget static YGWidget *get (YWidget *y_widget); + // debug + const char *getWidgetName() const { return m_ywidget->widgetClass(); } + virtual string getDebugLabel() const // let YWidget::debugLabel() be overloaded + { // container debug labels are worse than useless + if (m_ywidget->hasChildren()) return string(); + return m_ywidget->debugLabel(); } + // for YWidget virtual bool doSetKeyboardFocus(); virtual void doSetEnabling (bool enabled); + virtual void doAddChild (YWidget *child, GtkWidget *container); + virtual void doRemoveChild (YWidget *child, GtkWidget *container); // Event handling void emitEvent(YEvent::EventReason reason, bool if_notify = true, @@ -50,16 +50,14 @@ // for a container), call this function to make sure it is honored. virtual void sync_stretchable (YWidget *child = 0); - // should be used instead of YWidget::stretchable() as this has some safeguards - // against crashes that some YContainerWidgets lead to - bool isStretchable (YUIDimension dim); - protected: + void show(); + GtkWidget *m_widget; // associated GtkWidget -- use getWidget() - YWidget *m_y_widget; // associated YWidget GtkWidget *m_adj_size; // installed on m_widget, allows better size constrains + YWidget *m_ywidget; // associated YWidget - void construct (YWidget *y_widget, YGWidget *parent, + void construct (YWidget *ywidget, YWidget *yparent, bool show, GType type, const char *property_name, va_list args); }; @@ -69,29 +67,34 @@ * methods and the (multiply inherited) YGWidget base implementation * for GTK+. */ -#define YGWIDGET_IMPL_COMMON \ - virtual bool setKeyboardFocus() \ - { return doSetKeyboardFocus(); } \ - virtual void setEnabling (bool enabled) \ - { doSetEnabling (enabled); } \ - virtual long nicesize (YUIDimension dim) { return 0; } \ - virtual void moveChild (YWidget *child, long x, long y) {} \ - virtual void setSize (long width, long height) {} +#define YGWIDGET_IMPL_COMMON \ + virtual bool setKeyboardFocus() \ + { return doSetKeyboardFocus(); } \ + virtual void setEnabling (bool enabled) \ + { doSetEnabling (enabled); } \ + virtual int preferredWidth() { return 0; } \ + virtual int preferredHeight() { return 0; } \ + virtual void moveChild (YWidget *child, int x, int y) {} \ + virtual void setSize (int width, int height) {} + +#define YGWIDGET_IMPL_USE_BOLD(ParentClass) \ + virtual void setUseBoldFont (bool useBold) { \ + PangoWeight weight = useBold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL; \ + YGUtils::setWidgetFont (getWidget(), weight, PANGO_SCALE_MEDIUM); \ + ParentClass::setUseBoldFont (useBold); \ + } // for containers -// We can't use childAdded, since some classes don't want this called -// for some children. #define YGWIDGET_IMPL_CHILD_ADDED(container) \ virtual void addChild (YWidget *ychild) { \ - YContainerWidget::addChild (ychild); \ - GtkWidget *child = YGWidget::get (ychild)->getLayout(); \ - gtk_container_add (GTK_CONTAINER (container), child); \ - sync_stretchable(); \ + YWidget::addChild (ychild); \ + doAddChild (ychild, container); \ + sync_stretchable (ychild); \ } -#define YGWIDGET_IMPL_CHILD_REMOVED(container) \ - virtual void childRemoved (YWidget *ychild) { \ - GtkWidget *child = YGWidget::get (ychild)->getLayout(); \ - gtk_container_remove (GTK_CONTAINER (container), child); \ +#define YGWIDGET_IMPL_CHILD_REMOVED(container) \ + virtual void removeChild (YWidget *ychild) { \ + YWidget::removeChild (ychild); \ + doRemoveChild (ychild, container); \ } /* This is a convenience class that allows for a label next to the @@ -100,8 +103,8 @@ class YGLabeledWidget : public YGWidget { public: - YGLabeledWidget(YWidget *y_widget, YGWidget *parent, - YCPString label_text, YUIDimension label_ori, + YGLabeledWidget(YWidget *ywidget, YWidget *yparent, + const std::string &label_text, YUIDimension label_ori, bool show, GType type, const char *property_name, ...); virtual ~YGLabeledWidget () {} @@ -109,7 +112,7 @@ void setLabelVisible(bool show); void setBuddy (GtkWidget *widget); - virtual void doSetLabel (const YCPString &label); + virtual void doSetLabel (const std::string &label); YUIDimension orientation() { return m_orientation; } GtkWidget *getLabelWidget() { return m_label; } @@ -120,7 +123,7 @@ }; #define YGLABEL_WIDGET_IMPL_SET_LABEL_CHAIN(ParentClass) \ - virtual void setLabel (const YCPString &label) { \ + virtual void setLabel (const std::string &label) { \ IMPL \ doSetLabel (label); \ ParentClass::setLabel (label); \ @@ -130,11 +133,11 @@ class YGScrolledWidget : public YGLabeledWidget { public: - YGScrolledWidget(YWidget *y_widget, YGWidget *parent, + YGScrolledWidget(YWidget *ywidget, YWidget *yparent, bool show, GType type, const char *property_name, ...); // if you want a label, use: - YGScrolledWidget(YWidget *y_widget, YGWidget *parent, - YCPString label_text, YUIDimension label_ori, + YGScrolledWidget(YWidget *ywidget, YWidget *yparent, + const std::string &label_text, YUIDimension label_ori, bool show, GType type, const char *property_name, ...); virtual ~YGScrolledWidget () {} @@ -149,3 +152,4 @@ }; #endif /*YGWIDGET_H*/ + Modified: trunk/gtk/src/YGWizard.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGWizard.cc?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/YGWizard.cc (original) +++ trunk/gtk/src/YGWizard.cc Thu Dec 20 21:44:06 2007 @@ -10,10 +10,21 @@ #include "ygtkwizard.h" #include "YWizard.h" #include "YPushButton.h" +#include "YAlignment.h" +#include "YReplacePoint.h" +#include "YGDialog.h" + + +// FIXME: wizard events need to be ported +// We'll probably want to also make YGtkWizard buttons actual YGPushButtons... +// (let's just create them and pass button->getWidget() to the wizard...) +// (or let's just improve on the wrapper and id.) + class YGWizard : public YWizard, public YGWidget { bool m_verboseCommands; + YReplacePoint *m_replacePoint; /* YCP requires us to allow people to use YPushButton API on the wizard buttons. Wizard already has handlers for them; this seems like bad design. @@ -27,41 +38,41 @@ struct YGWButton : public YPushButton { /* Thin class; just changes the associated button label and keeps track of id change. */ - YGWButton (GtkWidget *widget, const YCPString &label, const YCPValue &id) - : YPushButton (YWidgetOpt(), label) - { m_widget = widget; setId (id); setLabel (label); } + YGWButton (YWidget *parent, GtkWidget *widget, const std::string &label) + : YPushButton (parent, label) + { setWidgetRep (NULL); m_widget = widget; setLabel (label); } - void setLabel (const YCPString &label) { - string str = YGUtils::mapKBAccel (label->value_cstr()); + void setLabel (const string &label) { + string str = YGUtils::mapKBAccel (label.c_str()); gtk_button_set_label (GTK_BUTTON (m_widget), str.c_str()); str.empty() ? gtk_widget_hide (m_widget) : gtk_widget_show (m_widget); YGUtils::setStockIcon (m_widget, str); YPushButton::setLabel (label); } - long nicesize (YUIDimension dim) { return 0; } - void setEnabling (bool enable) { + void setEnabled (bool enable) { gtk_widget_set_sensitive (m_widget, enable); - YWidget::setEnabling (enable); + YWidget::setEnabled (enable); } + int preferredWidth() { return 0; } + int preferredHeight() { return 0; } + void setSize (int w, int h) {} + private: GtkWidget *m_widget; }; - YGWButton *m_back_button, *m_abort_button, *m_next_button; + YGWButton *m_back_button, *m_abort_button, *m_next_button, *m_notes_button; // release notes button would be a little more hassle to support; yast-qt // doesn't support it too anyway. public: - YGWizard (const YWidgetOpt &opt, YGWidget *parent, - const YCPValue &backButtonId, const YCPString &backButtonLabel, - const YCPValue &abortButtonId, const YCPString &abortButtonLabel, - const YCPValue &nextButtonId, const YCPString &nextButtonLabel) - : YWizard (opt, backButtonId, backButtonLabel, - abortButtonId, abortButtonLabel, - nextButtonId, nextButtonLabel), - YGWidget (this, parent, true, YGTK_TYPE_WIZARD, NULL) + YGWizard (YWidget *parent, const string &backButtonLabel, + const string &abortButtonLabel, const string &nextButtonLabel, + YWizardMode wizardMode) + : YWizard (NULL, backButtonLabel, abortButtonLabel, nextButtonLabel, wizardMode) + , YGWidget (this, parent, true, YGTK_TYPE_WIZARD, NULL) { IMPL setBorder (0); @@ -69,59 +80,39 @@ //** Application area { - // We set a YReplacePoint as child with a certain id and it will then be - // replaced by the actual content. We put a YEmpty on it because it would - // crash otherwise (stretchable() functions should really check for - // hasChildren() first!). - - YWidgetOpt opt, stretchOpt; - stretchOpt.isHStretchable.setValue( true ); - stretchOpt.isVStretchable.setValue( true ); - - YWidget *align, *rp, *empty; - align = YGUI::ui()->createAlignment (this, stretchOpt, - YAlignCenter, YAlignCenter); - rp = YGUI::ui()->createReplacePoint (align, opt); - rp->setId (YCPSymbol (YWizardContentsReplacePointID)); - empty = YGUI::ui()->createEmpty (rp, opt); - - ((YContainerWidget *) align)->addChild (rp); - ((YContainerWidget *) rp)->addChild (empty); - this->addChild (align); + YAlignment *align = YUI::widgetFactory()->createAlignment (this, + YAlignCenter, YAlignCenter); + align->setStretchable (YD_HORIZ, true); + align->setStretchable (YD_VERT, true); + + m_replacePoint = YUI::widgetFactory()->createReplacePoint ((YWidget *) align); + YUI::widgetFactory()->createEmpty ((YWidget *) m_replacePoint); + m_replacePoint->showChild(); } - YGtkWizard *ygtk_wizard = YGTK_WIZARD (getWidget()); - //** Steps/tree pane - bool steps_enabled = opt.stepsEnabled.value(); - bool tree_enabled = opt.treeEnabled.value(); + bool steps_enabled = wizardMode == YWizardMode_Steps; + bool tree_enabled = wizardMode == YWizardMode_Tree; if (steps_enabled && tree_enabled) { y2error ("YGWizard doesn't support both steps and tree enabled at the " "same time.\nDisabling the steps..."); steps_enabled = false; } if (steps_enabled) - ygtk_wizard_enable_steps (ygtk_wizard); + ygtk_wizard_enable_steps (getWizard()); if (tree_enabled) - ygtk_wizard_enable_tree (ygtk_wizard); + ygtk_wizard_enable_tree (getWizard()); //** Setting the bottom buttons - m_back_button = new YGWButton (ygtk_wizard->m_back_button, backButtonLabel, - backButtonId); - m_abort_button = new YGWButton (ygtk_wizard->m_abort_button, abortButtonLabel, - abortButtonId); - m_next_button = new YGWButton (ygtk_wizard->m_next_button, nextButtonLabel, - nextButtonId); - YContainerWidget::addChild (m_back_button); - YContainerWidget::addChild (m_abort_button); - YContainerWidget::addChild (m_next_button); - - ygtk_wizard_set_back_button_id (ygtk_wizard, new YCPValue (backButtonId), - delete_data_cb); - ygtk_wizard_set_abort_button_id (ygtk_wizard, new YCPValue (abortButtonId), - delete_data_cb); - ygtk_wizard_set_next_button_id (ygtk_wizard, new YCPValue (nextButtonId), - delete_data_cb); + m_back_button = new YGWButton (this, getWizard()->m_back_button, backButtonLabel); + m_abort_button = new YGWButton (this, getWizard()->m_abort_button, abortButtonLabel); + m_next_button = new YGWButton (this, getWizard()->m_next_button, nextButtonLabel); + m_notes_button = new YGWButton (this, getWizard()->m_release_notes_button, string()); + + ygtk_wizard_set_back_button_ptr_id (getWizard(), (gpointer) m_back_button); + ygtk_wizard_set_next_button_ptr_id (getWizard(), (gpointer) m_next_button); + ygtk_wizard_set_abort_button_ptr_id (getWizard(), (gpointer) m_abort_button); + ygtk_wizard_set_release_notes_button_ptr_id (getWizard(), (gpointer) m_notes_button); //** All event are sent through this signal together with an id g_signal_connect (G_OBJECT (getWidget()), "action-triggered", @@ -133,240 +124,174 @@ // m_back/abort/next_button are added as children and will be freed by ~YContainerWidget } - /* The purpose of this function is to do some sanity checks, besides - the simple test "cmd->name() == func". - args_type is a reverse hexadecimal number where - any = 0, string = 1, boolean = 2. */ - static bool isCommand (const YCPTerm &cmd, const char *func, - guint args_nb, guint args_type) - { - if (cmd->name() == func) { - if ((unsigned) cmd->size() != args_nb) { - y2error ("YGWizard: expected %d arguments for the '%s' command. %d given.", - args_nb, func, cmd->size()); - return false; - } - - guint i, t; - for (i = 0, t = args_type; i < args_nb; i++, t >>= 4) - switch (t % 0x4) { - case 0x1: - if (!cmd->value(i)->isString()) { - y2error ("YGWizard: expected string as the %d argument for " - "the '%s' command.", i+1, func); - return false; - } - break; - case 0x2: - if (!cmd->value(i)->isBoolean()) { - y2error ("YGWizard: expected boolean as the %d argument for " - "the '%s' command.", i+1, func); - return false; - } - break; - } - return true; - } - return false; + inline YGtkWizard *getWizard() + { return YGTK_WIZARD (getWidget()); } + + virtual YReplacePoint *contentsReplacePoint() const + { return m_replacePoint; } + + virtual YPushButton *backButton() const + { return m_back_button; } + virtual YPushButton *abortButton() const + { return m_abort_button; } + virtual YPushButton *nextButton() const + { return m_next_button; } + + virtual void setButtonLabel (YPushButton *button, const string &label) + { + button->setLabel (label); } -#define getStdStringArg(cmd, arg) (cmd->value(arg)->asString()->value()) -#define getCStringArg(cmd, arg) (cmd->value(arg)->asString()->value_cstr()) -#define getBoolArg(cmd, arg) (cmd->value(arg)->asBoolean()->value()) -#define getAnyArg(cmd, arg) (cmd->value(arg)) + virtual void setHelpText (const string &text) + { + ygtk_wizard_set_help_text (getWizard(), text.c_str()); + } - YCPValue command (const YCPTerm &cmd) + virtual void setDialogIcon (const string &icon) { - IMPL - if (m_verboseCommands) - y2milestone ("Processing wizard command: %s\n", cmd->name().c_str()); + if (!ygtk_wizard_set_header_icon (getWizard(), YGDialog::currentWindow(), + icon.c_str())) + y2warning ("YGWizard: could not load image: %s", icon.c_str()); + } - YGtkWizard *wizard = YGTK_WIZARD (getWidget()); - if (isCommand (cmd, "SetHelpText", 1, 0x1)) - ygtk_wizard_set_help_text (wizard, getCStringArg (cmd, 0)); - - else if (isCommand (cmd, "AddTreeItem", 3, 0x111)) { - if (!ygtk_wizard_add_tree_item (wizard, getCStringArg (cmd, 0), - getCStringArg (cmd, 1), getCStringArg (cmd, 2))) { - y2error ("YGWizard: there is no tree item with id '%s'", - getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } - else if (isCommand (cmd, "DeleteTreeItems", 0, 0)) - ygtk_wizard_clear_tree (wizard); - else if (isCommand (cmd, "SelectTreeItem", 1, 0x1)) { - if (!ygtk_wizard_select_tree_item (wizard, getCStringArg (cmd, 0))) { - y2error ("YGWizard: there is no tree item with id '%s'", - getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } + virtual void setDialogHeading (const string &heading) + { + ygtk_wizard_set_header_text (getWizard(), YGDialog::currentWindow(), + heading.c_str()); + } - else if (isCommand (cmd, "SetDialogHeading", 1, 0x1)) - ygtk_wizard_set_header_text (wizard, YGUI::ui()->currentWindow(), - getCStringArg (cmd, 0)); - else if (isCommand (cmd, "SetDialogIcon", 1, 0x1)) { - if (!ygtk_wizard_set_header_icon (wizard, - YGUI::ui()->currentWindow(), getCStringArg (cmd, 0))) { - y2warning ("YGWizard: could not load image: %s", getCStringArg (cmd, 0)); -// return YCPBoolean (false); - installer relies on this succeeding - } - } + virtual void addStep (const string &text, const string &id) + { + ygtk_wizard_add_step (getWizard(), text.c_str(), id.c_str()); + } - else if (isCommand (cmd, "SetAbortButtonLabel", 1, 0x1) || - isCommand (cmd, "SetCancelButtonLabel", 1, 0x1)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 0)); - ygtk_wizard_set_abort_button_label (wizard, str.c_str()); - } - else if (isCommand (cmd, "SetBackButtonLabel", 1, 0x1)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 0)); - ygtk_wizard_set_back_button_label (wizard, str.c_str()); - } - else if (isCommand (cmd, "SetNextButtonLabel", 1, 0x1) || - isCommand (cmd, "SetAcceptButtonLabel", 1, 0x1)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 0)); - ygtk_wizard_set_next_button_label (wizard, str.c_str()); - } + virtual void addStepHeading (const string &text) + { + ygtk_wizard_add_step_header (getWizard(), text.c_str()); + } - else if (isCommand (cmd, "SetAbortButtonID", 1, 0x0)) { - YCPValue *id = new YCPValue (getAnyArg (cmd, 0)); - ygtk_wizard_set_abort_button_id (wizard, id, delete_data_cb); - m_abort_button->setId (*id); - } - else if (isCommand (cmd, "SetBackButtonID", 1, 0x0)) { - YCPValue *id = new YCPValue (getAnyArg (cmd, 0)); - ygtk_wizard_set_back_button_id (wizard, id, delete_data_cb); - m_back_button->setId (*id); - } - else if (isCommand (cmd, "SetNextButtonID", 1, 0x0)) { - YCPValue *id = new YCPValue (getAnyArg (cmd, 0)); - ygtk_wizard_set_next_button_id (wizard, id, delete_data_cb); - m_next_button->setId (*id); - } + virtual void deleteSteps() + { + ygtk_wizard_clear_steps (getWizard()); + } - else if (isCommand (cmd, "EnableAbortButton", 1, 0x2)) - ygtk_wizard_enable_abort_button (wizard, getBoolArg (cmd, 0)); - else if (isCommand (cmd, "EnableBackButton", 1, 0x2)) - ygtk_wizard_enable_back_button (wizard, getBoolArg (cmd, 0)); - else if (isCommand (cmd, "EnableNextButton", 1, 0x2)) - ygtk_wizard_enable_next_button (wizard, getBoolArg (cmd, 0)); - - else if (isCommand (cmd, "ProtectNextButton", 1, 0x2)) - ygtk_wizard_protect_next_button (wizard, getBoolArg (cmd, 0)); - - else if (isCommand (cmd, "SetFocusToNextButton", 0, 0)) - ygtk_wizard_focus_next_button (wizard); - else if (isCommand (cmd, "SetFocusToBackButton", 0, 0)) - ygtk_wizard_focus_back_button (wizard); - - else if (isCommand (cmd, "AddMenu", 2, 0x11)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 0)); - ygtk_wizard_add_menu (wizard, str.c_str(), getCStringArg (cmd, 1)); - } - else if (isCommand (cmd, "AddMenuEntry", 3, 0x111)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 1)); - if (!ygtk_wizard_add_menu_entry (wizard, getCStringArg (cmd, 0), - str.c_str(), getCStringArg (cmd, 2))) { - y2error ("YGWizard: there is no menu item with id '%s'", - getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } - else if (isCommand (cmd, "AddSubMenu", 3, 0x111)) { - string str = YGUtils::mapKBAccel(getCStringArg (cmd, 1)); - if (!ygtk_wizard_add_sub_menu (wizard, getCStringArg (cmd, 0), - str.c_str(), getCStringArg (cmd, 2))) { - y2error ("YGWizard: there is no menu item with id '%s'", - getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } - else if (isCommand (cmd, "AddMenuSeparator", 3, 0x111)) { - if (!ygtk_wizard_add_menu_separator (wizard, getCStringArg (cmd, 0))) { - y2error ("YGWizard: there is no menu item with id '%s'", - getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } + virtual void setCurrentStep (const string &id) + { + if (!ygtk_wizard_set_current_step (getWizard(), id.c_str())) + y2error ("YGWizard: there is no step with id %s.", id.c_str()); + } - else if (isCommand (cmd, "SetVerboseCommands", 1, 0x2)) - m_verboseCommands = getBoolArg (cmd, 0); - else if (isCommand (cmd, "Ping", 0, 0)) - y2debug ("YGWizard is active"); - - else if (isCommand (cmd, "AddStepHeading", 1, 0x1)) - ygtk_wizard_add_step_header (wizard, getCStringArg (cmd, 0)); - else if (isCommand (cmd, "AddStep", 2, 0x11)) - ygtk_wizard_add_step (wizard, getCStringArg (cmd, 0), getCStringArg (cmd, 1)); - else if (isCommand (cmd, "SetCurrentStep", 1, 0x1)) { - if (!ygtk_wizard_set_current_step (wizard, getCStringArg (cmd, 0))) { - y2error ("YGWizard: there is no step with id %s.", getCStringArg (cmd, 0)); - return YCPBoolean (false); - } - } - else if (isCommand (cmd, "UpdateSteps", 0, 0)) - ; - else if (isCommand (cmd, "DeleteSteps", 0, 0)) - ygtk_wizard_clear_steps (wizard); - - else if (isCommand (cmd, "ShowReleaseNotesButton", 2, 0x01)) { - string label = YGUtils::mapKBAccel(getCStringArg (cmd, 0)); - ygtk_wizard_set_release_notes_button_label (wizard, label.c_str(), - new YCPValue (getAnyArg (cmd, 1)), delete_data_cb); - } - else if (isCommand (cmd, "HideReleaseNotesButton", 0, 0)) - ygtk_wizard_show_release_notes_button (wizard, FALSE); + virtual void updateSteps() + {} - else if (isCommand (cmd, "RetranslateInternalButtons", 0, 0)) - ; // we don't need this as we don't use switch buttons + virtual void addTreeItem (const string &parentID, const string &text, + const string &id) + { + if (!ygtk_wizard_add_tree_item (getWizard(), parentID.c_str(), + text.c_str(), id.c_str())) + y2error ("YGWizard: there is no tree item with id '%s'", + parentID.c_str()); + } - else { - y2error ("Unsupported wizard command (or invalid arguments): %s\n", - cmd->name().c_str()); - return YCPBoolean (false); - } - return YCPBoolean (true); + virtual void selectTreeItem (const string &id) + { + if (!ygtk_wizard_select_tree_item (getWizard(), id.c_str())) + y2error ("YGWizard: there is no tree item with id '%s'", id.c_str()); } - virtual YCPString currentTreeSelection() + virtual string currentTreeSelection() { - YGtkWizard *wizard = YGTK_WIZARD (getWidget()); - const char *selected = ygtk_wizard_get_tree_selection (wizard); + const char *selected = ygtk_wizard_get_tree_selection (getWizard()); if (selected) - return YCPString (selected); - return YCPString (""); + return selected; + return string(); + } + + virtual void deleteTreeItems() + { + ygtk_wizard_clear_tree (getWizard()); + } + + virtual void addMenu (const string &text, const string &id) + { + string str = YGUtils::mapKBAccel (text); + ygtk_wizard_add_menu (getWizard(), str.c_str(), id.c_str()); + } + + virtual void addSubMenu (const string &parentID, const string &text, + const string &id) + { + string str = YGUtils::mapKBAccel(text); + if (!ygtk_wizard_add_sub_menu (getWizard(), parentID.c_str(), str.c_str(), + id.c_str())) + y2error ("YGWizard: there is no menu item with id '%s'", + parentID.c_str()); + } + + virtual void addMenuEntry (const string &parentID, const string &text, + const string &id) + { + string str = YGUtils::mapKBAccel (text); + if (!ygtk_wizard_add_menu_entry (getWizard(), parentID.c_str(), + str.c_str(), id.c_str())) + y2error ("YGWizard: there is no menu item with id '%s'", + parentID.c_str()); } + virtual void addMenuSeparator (const string & parentID) + { + if (!ygtk_wizard_add_menu_separator (getWizard(), parentID.c_str())) + y2error ("YGWizard: there is no menu item with id '%s'", + parentID.c_str()); + } + + virtual void deleteMenus() + { + ygtk_wizard_clear_menu (getWizard()); + } + + virtual void showReleaseNotesButton (const string &label, const string &id) + { + string str = YGUtils::mapKBAccel (label.c_str()); + ygtk_wizard_set_release_notes_button_label (getWizard(), str.c_str()); + ygtk_wizard_set_release_notes_button_str_id (getWizard(), id.c_str()); + } + + virtual void hideReleaseNotesButton() + { + ygtk_wizard_show_release_notes_button (getWizard(), FALSE); + } + + virtual void retranslateInternalButtons() + {} + static void action_triggered_cb (YGtkWizard *wizard, gpointer id, gint id_type, YGWizard *pThis) { IMPL - if ((GType) id_type == G_TYPE_STRING) { - YCPString _id ((char *) id); - YGUI::ui()->sendEvent (new YMenuEvent (YCPValue (_id))); - } + if ((GType) id_type == G_TYPE_STRING) + YGUI::ui()->sendEvent (new YMenuEvent ((char *) id)); else - YGUI::ui()->sendEvent (new YMenuEvent (*((YCPValue *) id))); + YGUI::ui()->sendEvent (new YWidgetEvent ((YWidget *) id, YEvent::Activated)); } - static void delete_data_cb (gpointer data) - { delete (YCPValue*) data; } - + virtual void doAddChild (YWidget *ychild, GtkWidget *container) + { + if (ychild->widgetRep()) + // don't actually add the button wrappers + YGWidget::doAddChild (ychild, container); + } YGWIDGET_IMPL_COMMON YGWIDGET_IMPL_CHILD_ADDED (getWidget()) YGWIDGET_IMPL_CHILD_REMOVED (getWidget()) }; -YWidget * -YGUI::createWizard (YWidget *parent, YWidgetOpt &opt, - const YCPValue &backButtonId, const YCPString &backButtonLabel, - const YCPValue &abortButtonId, const YCPString &abortButtonLabel, - const YCPValue &nextButtonId, const YCPString &nextButtonLabel) +YWizard *YGOptionalWidgetFactory::createWizard (YWidget *parent, + const string &backButtonLabel, const string &abortButtonLabel, + const string &nextButtonLabel, YWizardMode wizardMode) { - return new YGWizard (opt, YGWidget::get (parent), - backButtonId, backButtonLabel, - abortButtonId, abortButtonLabel, - nextButtonId, nextButtonLabel); + return new YGWizard (parent, backButtonLabel, abortButtonLabel, nextButtonLabel, + wizardMode); } + Modified: trunk/gtk/src/ygtkfieldentry.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkfieldentry.c?rev=4321... ============================================================================== --- trunk/gtk/src/ygtkfieldentry.c (original) +++ trunk/gtk/src/ygtkfieldentry.c Thu Dec 20 21:44:06 2007 @@ -10,79 +10,11 @@ #include <gtk/gtk.h> #include <string.h> -//** YGtkFilterEntry - -static void ygtk_filter_entry_editable_init (GtkEditableClass *iface); - -G_DEFINE_TYPE_WITH_CODE (YGtkFilterEntry, ygtk_filter_entry, GTK_TYPE_ENTRY, - G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, ygtk_filter_entry_editable_init)) - -static void ygtk_filter_entry_init (YGtkFilterEntry *entry) -{ -} - -static void ygtk_filter_entry_insert_text (GtkEditable *editable, const gchar *new_text, - gint new_text_length, gint *pos) -{ - const gchar *valid_chars = YGTK_FILTER_ENTRY (editable)->valid_chars; - if (valid_chars) { - const gchar *i, *j; - for (i = new_text; *i; i++) { - for (j = valid_chars; *j; j++) { - if (*i == *j) - break; - } - if (!*j) { - // not valid text - gdk_beep(); - return; - } - } - } - - GtkEditableClass *parent_editable_iface = g_type_interface_peek - (ygtk_filter_entry_parent_class, GTK_TYPE_EDITABLE); - parent_editable_iface->insert_text (editable, new_text, new_text_length, pos); -} - -static void ygtk_filter_entry_destroy (GtkObject *object) -{ - YGtkFilterEntry *entry = YGTK_FILTER_ENTRY (object); - if (entry->valid_chars) - g_free (entry->valid_chars); - entry->valid_chars = NULL; - - GTK_OBJECT_CLASS (ygtk_filter_entry_parent_class)->destroy (object); -} - -GtkWidget *ygtk_filter_entry_new (void) -{ - return g_object_new (YGTK_TYPE_FILTER_ENTRY, NULL); -} - -void ygtk_filter_entry_set_valid_chars (YGtkFilterEntry *entry, const gchar *valid_chars) -{ - if (entry->valid_chars) - g_free (entry->valid_chars); - entry->valid_chars = g_strdup (valid_chars); -} - -static void ygtk_filter_entry_class_init (YGtkFilterEntryClass *klass) -{ - ygtk_filter_entry_parent_class = g_type_class_peek_parent (klass); - - GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS (klass); - gtkobject_class->destroy = ygtk_filter_entry_destroy; -} - -static void ygtk_filter_entry_editable_init (GtkEditableClass *iface) -{ - iface->insert_text = ygtk_filter_entry_insert_text; -} +void ygutils_setFilter (GtkEntry *entry, const char *validChars); +static guint filter_entry_signal = 0; //** YGtkFieldEntry -static guint filter_entry_signal; G_DEFINE_TYPE (YGtkFieldEntry, ygtk_field_entry, GTK_TYPE_HBOX) static void ygtk_field_entry_init (YGtkFieldEntry *entry) @@ -90,14 +22,13 @@ gtk_box_set_spacing (GTK_BOX (entry), 4); } -static YGtkFilterEntry *ygtk_field_entry_focus_next_entry (YGtkFieldEntry *fields, - YGtkFilterEntry *current_entry, - gint side) +static GtkEntry *ygtk_field_entry_focus_next_entry (YGtkFieldEntry *fields, + GtkEntry *current_entry, gint side) { GList *children = gtk_container_get_children (GTK_CONTAINER (fields)); gint pos = g_list_index (children, current_entry); - YGtkFilterEntry *next_entry = g_list_nth_data (children, pos + (2 * side)); + GtkEntry *next_entry = g_list_nth_data (children, pos + (2 * side)); g_list_free (children); if (next_entry) @@ -110,8 +41,8 @@ gint new_text_length, gint *position, YGtkFieldEntry *fields) { if (*position == gtk_entry_get_max_length (GTK_ENTRY (editable))) { - YGtkFilterEntry *next_entry = ygtk_field_entry_focus_next_entry (fields, - YGTK_FILTER_ENTRY (editable), 1); + GtkEntry *next_entry = ygtk_field_entry_focus_next_entry (fields, + GTK_ENTRY (editable), 1); if (next_entry) { gint pos = 0; gtk_editable_insert_text (GTK_EDITABLE (next_entry), new_text, @@ -129,39 +60,60 @@ { if (move == GTK_MOVEMENT_VISUAL_POSITIONS) { if (count > 0) - ygtk_field_entry_focus_next_entry (fields, YGTK_FILTER_ENTRY (entry), 1); + ygtk_field_entry_focus_next_entry (fields, GTK_ENTRY (entry), 1); else - ygtk_field_entry_focus_next_entry (fields, YGTK_FILTER_ENTRY (entry), -1); + ygtk_field_entry_focus_next_entry (fields, GTK_ENTRY (entry), -1); } } + +GtkWidget *ygtk_field_entry_new (void) +{ + return g_object_new (YGTK_TYPE_FIELD_ENTRY, NULL); +} + static void ygtk_field_entry_entry_changed (GtkEditable *editable, YGtkFieldEntry *fields) { GList *children = gtk_container_get_children (GTK_CONTAINER (fields)); - gint nb = g_list_index (children, YGTK_FILTER_ENTRY (editable)) / 2; + gint nb = g_list_index (children, editable) / 2; g_list_free (children); g_signal_emit (fields, filter_entry_signal, 0, nb); } -GtkWidget *ygtk_field_entry_new (void) +static guint ygtk_field_entry_length (YGtkFieldEntry *fields) { - return g_object_new (YGTK_TYPE_FIELD_ENTRY, NULL); + guint length; + GList *children = gtk_container_get_children (GTK_CONTAINER (fields)); + length = g_list_length (children); + g_list_free (children); + return length; } -void ygtk_field_entry_add_field (YGtkFieldEntry *fields, gchar separator, - guint max_length, const gchar *valid_chars) +static inline guint child_to_index (YGtkFieldEntry *fields, guint child_i) +{ return child_i / 2; } +static inline guint index_to_child (YGtkFieldEntry *fields, guint index) +{ return index * 2; } + +GtkEntry *ygtk_field_entry_get_field_widget (YGtkFieldEntry *fields, guint index) { + GtkEntry *entry; + GList *children = gtk_container_get_children (GTK_CONTAINER (fields)); + entry = g_list_nth_data (children, index_to_child (fields, index)); + g_list_free (children); + g_assert (GTK_IS_ENTRY (entry)); + return entry; +} +guint ygtk_field_entry_add_field (YGtkFieldEntry *fields, gchar separator) +{ + guint new_index = child_to_index (fields, ygtk_field_entry_length (fields)+1); + GtkWidget *label = 0, *entry; - if (fields->use_separator) { + if (new_index > 0) { const gchar str[2] = { separator, '\0' }; label = gtk_label_new (str); } - entry = ygtk_filter_entry_new(); - gtk_entry_set_max_length (GTK_ENTRY (entry), max_length); - gtk_entry_set_width_chars (GTK_ENTRY (entry), (max_length == 0) ? -1 : max_length); - ygtk_filter_entry_set_valid_chars (YGTK_FILTER_ENTRY (entry), valid_chars); - + entry = gtk_entry_new(); g_signal_connect (G_OBJECT (entry), "insert-text", G_CALLBACK (ygtk_field_entry_insert_text), fields); g_signal_connect (G_OBJECT (entry), "move-cursor", @@ -171,33 +123,37 @@ G_CALLBACK (ygtk_field_entry_entry_changed), fields); GtkBox *box = GTK_BOX (fields); - if (label) - gtk_box_pack_start (box, label, FALSE, FALSE, 0); + if (label) { + gtk_box_pack_start (box, label, FALSE, TRUE, 0); + gtk_widget_show (label); + } gtk_box_pack_start (box, entry, TRUE, TRUE, 0); - - fields->use_separator = TRUE; + gtk_widget_show (entry); + return new_index; } -static YGtkFilterEntry *ygtk_field_entry_get_field (YGtkFieldEntry *fields, guint nb) +void ygtk_field_entry_setup_field (YGtkFieldEntry *fields, guint index, + gint max_length, const gchar *valid_chars) { - YGtkFilterEntry *entry; - - GList *children = gtk_container_get_children (GTK_CONTAINER (fields)); - entry = g_list_nth_data (children, nb * 2); - g_list_free (children); - - return entry; + GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index); + gboolean disable_len = (max_length <= 0); + gtk_entry_set_max_length (entry, disable_len ? 0 : max_length); + gtk_entry_set_width_chars (entry, disable_len ? -1 : max_length); + gtk_box_set_child_packing (GTK_BOX (fields), GTK_WIDGET (entry), + disable_len, TRUE, 0, GTK_PACK_START); + ygutils_setFilter (entry, valid_chars); } -void ygtk_field_entry_set_field_text (YGtkFieldEntry *fields, guint nb, const gchar *text) +void ygtk_field_entry_set_field_text (YGtkFieldEntry *fields, guint index, const gchar *text) { - YGtkFilterEntry *entry = ygtk_field_entry_get_field (fields, nb); + GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index); + g_signal_handlers_block_by_func (entry, (gpointer) ygtk_field_entry_entry_changed, fields); g_signal_handlers_block_by_func (entry, (gpointer) ygtk_field_entry_insert_text, fields); - gtk_entry_set_text (GTK_ENTRY (entry), text); + gtk_entry_set_text (entry, text); g_signal_handlers_unblock_by_func (entry, (gpointer) ygtk_field_entry_entry_changed, fields); @@ -205,10 +161,10 @@ (gpointer) ygtk_field_entry_insert_text, fields); } -const gchar *ygtk_field_entry_get_field_text (YGtkFieldEntry *fields, guint nb) +const gchar *ygtk_field_entry_get_field_text (YGtkFieldEntry *fields, guint index) { - YGtkFilterEntry *entry = ygtk_field_entry_get_field (fields, nb); - return gtk_entry_get_text (GTK_ENTRY (entry)); + GtkEntry *entry = ygtk_field_entry_get_field_widget (fields, index); + return gtk_entry_get_text (entry); } static void ygtk_field_entry_class_init (YGtkFieldEntryClass *klass) @@ -220,3 +176,4 @@ G_STRUCT_OFFSET (YGtkFieldEntryClass, filter_entry_changed), NULL, NULL, gtk_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } + Modified: trunk/gtk/src/ygtkfieldentry.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkfieldentry.h?rev=4321... ============================================================================== --- trunk/gtk/src/ygtkfieldentry.h (original) +++ trunk/gtk/src/ygtkfieldentry.h Thu Dec 20 21:44:06 2007 @@ -7,55 +7,13 @@ you need the user to set a IP address or time/date). The number of fields, their individual range and separation character is all customizable. - - YGtkFilterEntry is an extension to GtkEntry that only accepts - input that is specified in an array of valid characters */ -#ifndef YGTK_FILTER_ENTRY_H -#define YGTK_FILTER_ENTRY_H - -#include <gtk/gtkentry.h> -G_BEGIN_DECLS - -#define YGTK_TYPE_FILTER_ENTRY (ygtk_filter_entry_get_type ()) -#define YGTK_FILTER_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ - YGTK_TYPE_FILTER_ENTRY, YGtkFilterEntry)) -#define YGTK_FILTER_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ - YGTK_TYPE_FILTER_ENTRY, YGtkFilterEntryClass)) -#define YGTK_IS_FILTER_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ - YGTK_TYPE_FILTER_ENTRY)) -#define YGTK_IS_FILTER_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ - YGTK_TYPE_FILTER_ENTRY)) -#define YGTK_FILTER_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ - YGTK_TYPE_FILTER_ENTRY, YGtkFilterEntryClass)) - -typedef struct _YGtkFilterEntry -{ - GtkEntry parent; - - // private: - gchar *valid_chars; -} YGtkFilterEntry; - -typedef struct _YGtkFilterEntryClass -{ - GtkEntryClass parent_class; -} YGtkFilterEntryClass; - -GtkWidget* ygtk_filter_entry_new (void); -GType ygtk_filter_entry_get_type (void) G_GNUC_CONST; - -void ygtk_filter_entry_set_valid_chars (YGtkFilterEntry *entry, - const gchar *valid_chars); - -G_END_DECLS -#endif /*YGTK_FILTER_ENTRY_H*/ - #ifndef YGTK_FIELD_ENTRY_H #define YGTK_FIELD_ENTRY_H #include <gtk/gtkhbox.h> +#include <gtk/gtkentry.h> G_BEGIN_DECLS #define YGTK_TYPE_FIELD_ENTRY (ygtk_field_entry_get_type ()) @@ -73,10 +31,6 @@ typedef struct _YGtkFieldEntry { GtkHBox parent; - - // private: - // used to disable separator for the first field - gboolean use_separator; } YGtkFieldEntry; typedef struct _YGtkFieldEntryClass @@ -89,14 +43,17 @@ GtkWidget* ygtk_field_entry_new (void); GType ygtk_field_entry_get_type (void) G_GNUC_CONST; -// if this is the first field, separator will be ignored. max_length can be 0 to -// disable it. valids_chars can be NULL to disable it. -void ygtk_field_entry_add_field (YGtkFieldEntry *entry, gchar separator, - guint max_length, const gchar *valid_chars); - -// convinience -void ygtk_field_entry_set_field_text (YGtkFieldEntry *entry, guint nb, const gchar *text); -const gchar *ygtk_field_entry_get_field_text (YGtkFieldEntry *entry, guint nb); +// if this is the first field, separator will be ignored. +guint ygtk_field_entry_add_field (YGtkFieldEntry *entry, gchar separator); +//max_length can be 0 to disable it. valids_chars can be NULL to disable it. +void ygtk_field_entry_setup_field (YGtkFieldEntry *entry, guint index, + gint max_length, const gchar *valid_chars); + +void ygtk_field_entry_set_field_text (YGtkFieldEntry *entry, guint index, const gchar *text); +const gchar *ygtk_field_entry_get_field_text (YGtkFieldEntry *entry, guint index); + +GtkEntry *ygtk_field_entry_get_field_widget (YGtkFieldEntry *entry, guint index); G_END_DECLS #endif /*YGTK_FIELD_ENTRY_H*/ + Modified: trunk/gtk/src/ygtkfindentry.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkfindentry.c?rev=43216... ============================================================================== --- trunk/gtk/src/ygtkfindentry.c (original) +++ trunk/gtk/src/ygtkfindentry.c Thu Dec 20 21:44:06 2007 @@ -128,7 +128,7 @@ gdk_window_set_user_data (*window, widget); // set background style ygtk_ext_entry_sync_color (entry); - + if (GTK_WIDGET_MAPPED (widget)) gdk_window_show (*window); gtk_widget_queue_resize (widget); @@ -349,12 +349,13 @@ gdk_window_set_cursor (eentry->left_window, cursor); gdk_window_set_cursor (eentry->right_window, cursor); gdk_cursor_unref (cursor); + gdk_window_hide (eentry->right_window); // show when text is inserted } static void ygtk_find_entry_map (GtkWidget *widget) { - if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget)) { - GTK_WIDGET_CLASS (ygtk_find_entry_parent_class)->map (widget); + GTK_WIDGET_CLASS (ygtk_find_entry_parent_class)->map (widget); + if (GTK_WIDGET_REALIZED (widget)) { // only show clear icon when the entry has text GdkWindow *clear_win = YGTK_EXT_ENTRY (widget)->right_window; if (clear_win) @@ -470,14 +471,9 @@ (ygtk_find_entry_parent_class, GTK_TYPE_EDITABLE); parent_editable_iface->delete_text (editable, start_pos, end_pos); - int has_text = strlen (gtk_entry_get_text (GTK_ENTRY (editable))); - if (!has_text) { - /* Set or delete text may be called while the widget has not yet been - realized. */ - GdkWindow *clear_win = YGTK_EXT_ENTRY (editable)->right_window; - if (clear_win) - gdk_window_hide (clear_win); - } + GdkWindow *clear_win = YGTK_EXT_ENTRY (editable)->right_window; + if (clear_win) + gdk_window_hide (clear_win); } void ygtk_find_entry_attach_menu (YGtkFindEntry *entry, GtkMenu *menu) Modified: trunk/gtk/src/ygtkimage.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkimage.c?rev=43216&r1=... ============================================================================== --- trunk/gtk/src/ygtkimage.c (original) +++ trunk/gtk/src/ygtkimage.c Thu Dec 20 21:44:06 2007 @@ -157,7 +157,8 @@ image->align = align; if (image->alt_text) g_free (image->alt_text); - image->alt_text = g_strdup (alt_text); + if (alt_text) + image->alt_text = g_strdup (alt_text); gtk_widget_queue_draw (GTK_WIDGET (image)); } @@ -208,21 +209,23 @@ cairo_t *cr = gdk_cairo_create (widget->window); - if (!image->loaded && image->alt_text) { - // show alt text if no image was loaded - PangoLayout *layout; - layout = gtk_widget_create_pango_layout (widget, image->alt_text); - - int x, y; - x = (width - widget->requisition.width) / 2; - y = (height - widget->requisition.height) / 2; + if (!image->loaded) { + if (image->alt_text) { + // show alt text if no image was loaded + PangoLayout *layout; + layout = gtk_widget_create_pango_layout (widget, image->alt_text); + + int x, y; + x = (width - widget->requisition.width) / 2; + y = (height - widget->requisition.height) / 2; - cairo_move_to (cr, x, y); - pango_cairo_show_layout (cr, layout); + cairo_move_to (cr, x, y); + pango_cairo_show_layout (cr, layout); - g_object_unref (layout); + g_object_unref (layout); + } cairo_destroy (cr); - return TRUE; + return FALSE; } GdkPixbuf *pixbuf; Modified: trunk/gtk/src/ygtkmenubutton.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkmenubutton.c?rev=4321... ============================================================================== --- trunk/gtk/src/ygtkmenubutton.c (original) +++ trunk/gtk/src/ygtkmenubutton.c Thu Dec 20 21:44:06 2007 @@ -104,22 +104,13 @@ button->label = gtk_label_new (""); GtkWidget *hbox, *arrow; - hbox = gtk_hbox_new (FALSE, 0); + hbox = gtk_hbox_new (FALSE, 4); arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN); + gtk_widget_show (hbox); + gtk_widget_show (arrow); - if (gtk_widget_get_direction (arrow) == GTK_TEXT_DIR_LTR) { - gtk_container_add (GTK_CONTAINER (hbox), button->label); - gtk_container_add (GTK_CONTAINER (hbox), arrow); - } - else { - gtk_container_add (GTK_CONTAINER (hbox), arrow); - gtk_container_add (GTK_CONTAINER (hbox), button->label); - } - - gtk_box_set_child_packing (GTK_BOX (hbox), arrow, FALSE, FALSE, - 5, GTK_PACK_START); - - gtk_widget_show_all (hbox); + gtk_box_pack_start (GTK_BOX (hbox), button->label, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), arrow, FALSE, TRUE, 0); gtk_container_add (GTK_CONTAINER (button), hbox); } Modified: trunk/gtk/src/ygtkratiobox.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkratiobox.c?rev=43216&... ============================================================================== --- trunk/gtk/src/ygtkratiobox.c (original) +++ trunk/gtk/src/ygtkratiobox.c Thu Dec 20 21:44:06 2007 @@ -521,18 +521,18 @@ widget_class->size_allocate = ygtk_adj_size_size_allocate; } -//** YGtkScrolledWindow +//** YGtkTunedScrolledWindow -G_DEFINE_TYPE (YGtkScrolledWindow, ygtk_scrolled_window, GTK_TYPE_SCROLLED_WINDOW) +G_DEFINE_TYPE (YGtkTunedScrolledWindow, ygtk_tuned_scrolled_window, GTK_TYPE_SCROLLED_WINDOW) -static void ygtk_scrolled_window_init (YGtkScrolledWindow *scroll) +static void ygtk_tuned_scrolled_window_init (YGtkTunedScrolledWindow *scroll) { } -static void ygtk_scrolled_window_size_request (GtkWidget *widget, +static void ygtk_tuned_scrolled_window_size_request (GtkWidget *widget, GtkRequisition *requisition) { - YGtkScrolledWindow *scroll = YGTK_SCROLLED_WINDOW (widget); + YGtkTunedScrolledWindow *scroll = YGTK_TUNED_SCROLLED_WINDOW (widget); GtkRequisition child_req; GtkWidget *child = GTK_BIN (widget)->child; @@ -555,31 +555,33 @@ gscroll->vscrollbar_policy = GTK_POLICY_AUTOMATIC; } - GTK_WIDGET_CLASS (ygtk_scrolled_window_parent_class)->size_request (widget, requisition); - // to avoid disruptions: - requisition->width = MIN (requisition->width, scroll->max_width); - requisition->height = MIN (requisition->height, scroll->max_height); + GTK_WIDGET_CLASS (ygtk_tuned_scrolled_window_parent_class)->size_request (widget, requisition); + if (scroll->max_width) + requisition->width = MIN (requisition->width, scroll->max_width); + if (scroll->max_height) + requisition->height = MIN (requisition->height, scroll->max_height); } -GtkWidget* ygtk_scrolled_window_new (GtkWidget *child) +GtkWidget* ygtk_tuned_scrolled_window_new (GtkWidget *child) { - YGtkScrolledWindow *scroll = g_object_new (YGTK_TYPE_SCROLLED_WINDOW, NULL); + YGtkTunedScrolledWindow *scroll = g_object_new (YGTK_TYPE_TUNED_SCROLLED_WINDOW, NULL); if (child) gtk_container_add (GTK_CONTAINER (scroll), child); return GTK_WIDGET (scroll); } -void ygtk_scrolled_window_set_auto_policy (YGtkScrolledWindow *scroll, +void ygtk_tuned_scrolled_window_set_auto_policy (YGtkTunedScrolledWindow *scroll, guint max_width, guint max_height) { scroll->max_width = max_width; scroll->max_height = max_height; } -static void ygtk_scrolled_window_class_init (YGtkScrolledWindowClass *klass) +static void ygtk_tuned_scrolled_window_class_init (YGtkTunedScrolledWindowClass *klass) { - ygtk_scrolled_window_parent_class = g_type_class_peek_parent (klass); + ygtk_tuned_scrolled_window_parent_class = g_type_class_peek_parent (klass); GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass); - widget_class->size_request = ygtk_scrolled_window_size_request; + widget_class->size_request = ygtk_tuned_scrolled_window_size_request; } + Modified: trunk/gtk/src/ygtkratiobox.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkratiobox.h?rev=43216&... ============================================================================== --- trunk/gtk/src/ygtkratiobox.h (original) +++ trunk/gtk/src/ygtkratiobox.h Thu Dec 20 21:44:06 2007 @@ -199,41 +199,42 @@ /* YGtkScrolledWindow gives some a more fine-grained automatic scroll policy. It allows the user to specify from which size scrolling should be applied. */ -#ifndef YGTK_SCROLLED_WIDOW_H -#define YGTK_SCROLLED_WIDOW_H +#ifndef YGTK_TUNED_SCROLLED_WIDOW_H +#define YGTK_TUNED_SCROLLED_WIDOW_H #include <gtk/gtkscrolledwindow.h> G_BEGIN_DECLS -#define YGTK_TYPE_SCROLLED_WINDOW (ygtk_scrolled_window_get_type ()) -#define YGTK_SCROLLED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ - YGTK_TYPE_SCROLLED_WINDOW, YGtkScrolledWindow)) -#define YGTK_SCROLLED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ - YGTK_TYPE_SCROLLED_WINDOW, YGtkScrolledWindowClass)) -#define YGTK_IS_SCROLLED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ - YGTK_TYPE_SCROLLED_WINDOW)) -#define YGTK_IS_SCROLLED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ - YGTK_TYPE_SCROLLED_WINDOW)) -#define YGTK_SCROLLED_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ - YGTK_TYPE_SCROLLED_WINDOW, YGtkScrolledWindowClass)) +#define YGTK_TYPE_TUNED_SCROLLED_WINDOW (ygtk_tuned_scrolled_window_get_type ()) +#define YGTK_TUNED_SCROLLED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + YGTK_TYPE_TUNED_SCROLLED_WINDOW, YGtkTunedScrolledWindow)) +#define YGTK_TUNED_SCROLLED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ + YGTK_TYPE_TUNED_SCROLLED_WINDOW, YGtkTunedScrolledWindowClass)) +#define YGTK_IS_TUNED_SCROLLED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + YGTK_TYPE_TUNED_SCROLLED_WINDOW)) +#define YGTK_IS_TUNED_SCROLLED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + YGTK_TYPE_TUNED_SCROLLED_WINDOW)) +#define YGTK_TUNED_SCROLLED_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + YGTK_TYPE_TUNED_SCROLLED_WINDOW, YGtkTunedScrolledWindowClass)) -typedef struct _YGtkScrolledWindow +typedef struct _YGtkTunedScrolledWindow { GtkScrolledWindow parent; // members guint max_width, max_height; -} YGtkScrolledWindow; +} YGtkTunedScrolledWindow; -typedef struct _YGtkScrolledWindowClass +typedef struct _YGtkTunedScrolledWindowClass { GtkScrolledWindowClass parent_class; -} YGtkScrolledWindowClass; +} YGtkTunedScrolledWindowClass; -GType ygtk_scrolled_window_get_type (void) G_GNUC_CONST; -GtkWidget* ygtk_scrolled_window_new (GtkWidget *child /*or NULL*/); +GType ygtk_tuned_scrolled_window_get_type (void) G_GNUC_CONST; +GtkWidget* ygtk_tuned_scrolled_window_new (GtkWidget *child /*or NULL*/); -void ygtk_scrolled_window_set_auto_policy (YGtkScrolledWindow *scroll, - guint max_width, guint max_height); +void ygtk_tuned_scrolled_window_set_auto_policy (YGtkTunedScrolledWindow *scroll, + guint max_width, guint max_height); G_END_DECLS -#endif /*YGTK_SCROLLED_WIDOW_H*/ +#endif /*YGTK_TUNED_SCROLLED_WIDOW_H*/ + Modified: trunk/gtk/src/ygtkrichtext.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkrichtext.c?rev=43216&... ============================================================================== --- trunk/gtk/src/ygtkrichtext.c (original) +++ trunk/gtk/src/ygtkrichtext.c Thu Dec 20 21:44:06 2007 @@ -539,28 +539,36 @@ } /* String preparation methods. */ - -#define IS_WHITE(c) (g_ascii_isspace (c) || (c) == '\t') - static char *elide_whitespace (const char *instr, int len) { GString *dest = g_string_new (""); if (len < 0) len = strlen (instr); gboolean last_white = FALSE; + // transform breaklines in whitespace if in the middle of the text + gboolean special_white = FALSE, start_text = TRUE; int i; -// FIXME: whitespace elision needs to happen across tags [urk] -// FIXME: perhaps post-process non-pre sections when they are complete ? for (i = 0; i < len; i++) { char ch = instr[i]; - if (ch == '\r' || ch == '\n') + if (ch == '\n') { + if (!start_text) + special_white = TRUE; continue; + } if (ch == '\t') ch = ' '; - gboolean cur_white = IS_WHITE (ch); + gboolean cur_white = ch == ' '; + if (!cur_white) { + start_text = FALSE; + if (special_white) { + g_string_append_c (dest, ' '); + special_white = FALSE; + } + } if (!cur_white || !last_white) g_string_append_c (dest, ch); + last_white = cur_white; } Modified: trunk/gtk/src/ygtkwizard.c URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkwizard.c?rev=43216&r1... ============================================================================== --- trunk/gtk/src/ygtkwizard.c (original) +++ trunk/gtk/src/ygtkwizard.c Thu Dec 20 21:44:06 2007 @@ -265,8 +265,13 @@ static void button_clicked_cb (GtkButton *button, YGtkWizard *wizard) { - gpointer id = g_object_get_data (G_OBJECT (button), "id"); - g_signal_emit (wizard, action_triggered_signal, 0, id, G_TYPE_POINTER); + gpointer id; + id = g_object_get_data (G_OBJECT (button), "ptr-id"); + if (id) + g_signal_emit (wizard, action_triggered_signal, 0, id, G_TYPE_POINTER); + id = g_object_get_data (G_OBJECT (button), "str-id"); + if (id) + g_signal_emit (wizard, action_triggered_signal, 0, id, G_TYPE_STRING); } static GtkWidget *button_new (YGtkWizard *wizard) @@ -305,6 +310,7 @@ g_free, NULL); gtk_container_set_border_width (GTK_CONTAINER (wizard), BORDER); + wizard->child_border_width = CHILD_BORDER; //** Title wizard->m_title = gtk_hbox_new (FALSE, 0); @@ -403,12 +409,10 @@ /* We must unparent these widgets from the wizard as they would try to use gtk_container_remove() on it. We ref them since we still want to call destroy on them so they children die. */ -#define DESTROY_WIDGET(widget) \ - if (widget) { \ - g_object_ref (G_OBJECT (widget)); \ - gtk_widget_unparent (widget); \ - gtk_widget_destroy (widget); \ - widget = NULL; \ +#define DESTROY_WIDGET(widget) \ + if (widget) { \ + gtk_widget_unparent (widget); \ + widget = NULL; \ } DESTROY_WIDGET (wizard->m_title) DESTROY_WIDGET (wizard->m_buttons) @@ -645,31 +649,53 @@ ygutils_setStockIcon (wizard->m_next_button, text); } -void ygtk_wizard_set_back_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb) +void ygtk_wizard_set_back_button_ptr_id (YGtkWizard *wizard, gpointer id) +{ + g_object_set_data (G_OBJECT (wizard->m_back_button), "ptr-id", id); +} + +void ygtk_wizard_set_next_button_ptr_id (YGtkWizard *wizard, gpointer id) { - g_object_set_data_full (G_OBJECT (wizard->m_back_button), "id", id, destroy_cb); + g_object_set_data (G_OBJECT (wizard->m_next_button), "ptr-id", id); } -void ygtk_wizard_set_next_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb) +void ygtk_wizard_set_abort_button_ptr_id (YGtkWizard *wizard, gpointer id) { - g_object_set_data_full (G_OBJECT (wizard->m_next_button), "id", id, destroy_cb); + g_object_set_data (G_OBJECT (wizard->m_abort_button), "ptr-id", id); } -void ygtk_wizard_set_abort_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb) +void ygtk_wizard_set_release_notes_button_ptr_id (YGtkWizard *wizard, gpointer id) { - g_object_set_data_full (G_OBJECT (wizard->m_abort_button), "id", id, destroy_cb); + g_object_set_data (G_OBJECT (wizard->m_release_notes_button), "ptr-id", id); } -void ygtk_wizard_set_release_notes_button_label (YGtkWizard *wizard, - const gchar *text, gpointer id, - GDestroyNotify destroy_cb) +void ygtk_wizard_set_back_button_str_id (YGtkWizard *wizard, const char *id) +{ + g_object_set_data_full (G_OBJECT (wizard->m_back_button), "str-id", + g_strdup (id), g_free); +} + +void ygtk_wizard_set_next_button_str_id (YGtkWizard *wizard, const char *id) +{ + g_object_set_data_full (G_OBJECT (wizard->m_next_button), "str-id", + g_strdup (id), g_free); +} + +void ygtk_wizard_set_abort_button_str_id (YGtkWizard *wizard, const char *id) +{ + g_object_set_data_full (G_OBJECT (wizard->m_abort_button), "str-id", + g_strdup (id), g_free); +} + +void ygtk_wizard_set_release_notes_button_str_id (YGtkWizard *wizard, const char *id) +{ + g_object_set_data_full (G_OBJECT (wizard->m_release_notes_button), "str-id", + g_strdup (id), g_free); +} + +void ygtk_wizard_set_release_notes_button_label (YGtkWizard *wizard, const gchar *text) { gtk_button_set_label (GTK_BUTTON (wizard->m_release_notes_button), text); - g_object_set_data_full (G_OBJECT (wizard->m_release_notes_button), "id", - id, destroy_cb); gtk_widget_show (wizard->m_release_notes_button); } @@ -784,6 +810,18 @@ return TRUE; } +void ygtk_wizard_clear_menu (YGtkWizard *wizard) +{ + if (!wizard->m_menu) + return; + yg_hash_table_remove_all (wizard->menu_ids); + GList *children = gtk_container_get_children (GTK_CONTAINER (wizard->m_menu)), *i; + for (i = children; i; i = i->next) { + GtkWidget *child = (GtkWidget *) i->data; + gtk_container_remove (GTK_CONTAINER (wizard->m_menu), child); + } +} + void ygtk_wizard_add_step_header (YGtkWizard *wizard, const char *text) { g_return_if_fail (wizard->m_steps != NULL); @@ -856,6 +894,7 @@ YGtkWizard *wizard = YGTK_WIZARD (widget); gint border = GTK_CONTAINER (wizard)->border_width; + gint child_border = wizard->child_border_width; gint header_padding = get_header_padding (GTK_WIDGET (wizard)); gint content_padding = get_content_padding (GTK_WIDGET (wizard)); GtkRequisition req; // temp usage @@ -894,8 +933,8 @@ gtk_widget_size_request (child, &child_req); else child_req.width = child_req.height = 0; - child_req.width += content_padding * 2 + CHILD_BORDER*2; - child_req.height += content_padding * 2 + CHILD_BORDER*2; + child_req.width += content_padding * 2 + child_border*2; + child_req.height += content_padding * 2 + child_border*2; req.width = nav_req.width + child_req.width + border*2; req.height = MAX (nav_req.height, child_req.height); @@ -995,7 +1034,7 @@ // child GtkWidget *child = GTK_BIN (wizard)->child; if (child && GTK_WIDGET_VISIBLE (child)) { - apply_allocation_padding (&child_area, content_padding + CHILD_BORDER); + apply_allocation_padding (&child_area, content_padding + wizard->child_border_width); gtk_widget_size_allocate (child, &child_area); } @@ -1087,6 +1126,150 @@ (*callback) (containee, callback_data); } +/* Accessibility support */ + +static gint ygtk_wizard_accessible_get_n_children (AtkObject *accessible) +{ + return 1 /* content*/ + 5 /* buttons*/; +} + +static AtkObject *ygtk_wizard_accessible_ref_child (AtkObject *accessible, + gint index) +{ + GtkWidget *widget = GTK_ACCESSIBLE (accessible)->widget; + if (!widget) + return NULL; + YGtkWizard *wizard = YGTK_WIZARD (widget); + + if (index == 0) { + GtkWidget *child = GTK_BIN (wizard)->child; + if (child) + return g_object_ref (G_OBJECT (child)); + return NULL; + } + + if (index >= 1 && index <= 5) { + GtkWidget *buttons[5] = { wizard->m_back_button, wizard->m_abort_button, + wizard->m_next_button, wizard->m_help_button, + wizard->m_release_notes_button }; + GtkWidget *button = buttons [index-1]; + + if (GTK_WIDGET_VISIBLE (button)) + return g_object_ref (G_OBJECT (button)); + return NULL; + } + // out of range + return NULL; +} + +static void ygtk_wizard_accessible_class_init (AtkObjectClass *class) +{ + class->get_n_children = ygtk_wizard_accessible_get_n_children; + class->ref_child = ygtk_wizard_accessible_ref_child; +} + +static GType ygtk_wizard_accessible_get_type (void) +{ + static GType type = 0; + if (!type) { + AtkObjectFactory *factory; + GType derived_type; + GTypeQuery query; + GType derived_atk_type; + + derived_type = g_type_parent (YGTK_TYPE_WIZARD); + factory = atk_registry_get_factory (atk_get_default_registry (), derived_type); + derived_atk_type = atk_object_factory_get_accessible_type (factory); + g_type_query (derived_atk_type, &query); + + GTypeInfo type_info = { 0 }; + type_info.class_size = query.class_size; + type_info.class_init = (GClassInitFunc) ygtk_wizard_accessible_class_init; + type_info.instance_size = query.instance_size; + + type = g_type_register_static (derived_atk_type, "YGtkWizardAccessible", + &type_info, 0); + +/* + type = g_type_register_static_simple (derived_atk_type, + "YGtkWizardAccessible", query.class_size, + (GClassInitFunc) ygtk_wizard_accessible_class_init, + query.instance_size, NULL, 0); +*/ + } + return type; +} + +static AtkObject *ygtk_wizard_accessible_new (GObject *obj) +{ + AtkObject *accessible; + g_return_val_if_fail (YGTK_IS_WIZARD (obj), NULL); + + accessible = g_object_new (ygtk_wizard_accessible_get_type (), NULL); + atk_object_initialize (accessible, obj); + return accessible; +} + +static GType ygtk_wizard_accessible_factory_get_accessible_type() +{ + return ygtk_wizard_accessible_get_type (); +} + +static AtkObject*ygtk_wizard_accessible_factory_create_accessible (GObject *obj) +{ + return ygtk_wizard_accessible_new (obj); +} + +static void ygtk_wizard_accessible_factory_class_init (AtkObjectFactoryClass *class) +{ + class->create_accessible = ygtk_wizard_accessible_factory_create_accessible; + class->get_accessible_type = ygtk_wizard_accessible_factory_get_accessible_type; +} + +static GType ygtk_wizard_accessible_factory_get_type (void) +{ + static GType type = 0; + if (!type) { + GTypeInfo type_info = { 0 }; + type_info.class_size = sizeof (AtkObjectFactoryClass); + type_info.class_init = (GClassInitFunc) ygtk_wizard_accessible_factory_class_init; + type_info.instance_size = sizeof (AtkObjectFactory); + + type = g_type_register_static (ATK_TYPE_OBJECT_FACTORY, + "YGtkWizardAccessibleFactory", &type_info, 0); + +/* + type = g_type_register_static_simple (ATK_TYPE_OBJECT_FACTORY, + "YGtkWizardAccessibleFactory", sizeof (AtkObjectFactoryClass), + (GClassInitFunc) ygtk_wizard_accessible_factory_class_init, + sizeof (AtkObjectFactory), NULL, 0); +*/ + } + return type; +} + +static AtkObject *ygtk_wizard_get_accessible (GtkWidget *widget) +{ + static gboolean first_time = TRUE; + if (first_time) { + AtkObjectFactory *factory; + AtkRegistry *registry; + GType derived_type; + GType derived_atk_type; + + derived_type = g_type_parent (YGTK_TYPE_WIZARD); + registry = atk_get_default_registry (); + factory = atk_registry_get_factory (registry, derived_type); + derived_atk_type = atk_object_factory_get_accessible_type (factory); + if (g_type_is_a (derived_atk_type, GTK_TYPE_ACCESSIBLE)) { + atk_registry_set_factory_type (registry, YGTK_TYPE_WIZARD, + ygtk_wizard_accessible_factory_get_type ()); + } + first_time = FALSE; + } + return GTK_WIDGET_CLASS (ygtk_wizard_parent_class)->get_accessible (widget); +} + static void ygtk_wizard_class_init (YGtkWizardClass *klass) { ygtk_wizard_parent_class = g_type_class_peek_parent (klass); @@ -1097,6 +1280,7 @@ widget_class->realize = ygtk_wizard_realize; widget_class->size_request = ygtk_wizard_size_request; widget_class->size_allocate = ygtk_wizard_size_allocate; + widget_class->get_accessible = ygtk_wizard_get_accessible; GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); container_class->forall = ygtk_wizard_forall; Modified: trunk/gtk/src/ygtkwizard.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkwizard.h?rev=43216&r1... ============================================================================== --- trunk/gtk/src/ygtkwizard.h (original) +++ trunk/gtk/src/ygtkwizard.h Thu Dec 20 21:44:06 2007 @@ -93,6 +93,8 @@ /* The help text. */ gchar *m_help; GtkWidget *m_help_dialog; + + guint child_border_width; } YGtkWizard; typedef struct _YGtkWizardClass @@ -129,12 +131,14 @@ void ygtk_wizard_set_back_button_label (YGtkWizard *wizard, const char *text); void ygtk_wizard_set_abort_button_label (YGtkWizard *wizard, const char *text); void ygtk_wizard_set_next_button_label (YGtkWizard *wizard, const char *text); -void ygtk_wizard_set_back_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb); -void ygtk_wizard_set_next_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb); -void ygtk_wizard_set_abort_button_id (YGtkWizard *wizard, gpointer id, - GDestroyNotify destroy_cb); +void ygtk_wizard_set_back_button_str_id (YGtkWizard *wizard, const char *id); +void ygtk_wizard_set_next_button_str_id (YGtkWizard *wizard, const char *id); +void ygtk_wizard_set_abort_button_str_id (YGtkWizard *wizard, const char *id); +void ygtk_wizard_set_release_notes_button_str_id (YGtkWizard *wizard, const char *id); +void ygtk_wizard_set_back_button_ptr_id (YGtkWizard *wizard, gpointer id); +void ygtk_wizard_set_next_button_ptr_id (YGtkWizard *wizard, gpointer id); +void ygtk_wizard_set_abort_button_ptr_id (YGtkWizard *wizard, gpointer id); +void ygtk_wizard_set_release_notes_button_ptr_id (YGtkWizard *wizard, gpointer id); void ygtk_wizard_enable_back_button (YGtkWizard *wizard, gboolean enable); void ygtk_wizard_enable_next_button (YGtkWizard *wizard, gboolean enable); void ygtk_wizard_enable_abort_button (YGtkWizard *wizard, gboolean enable); @@ -150,6 +154,7 @@ gboolean ygtk_wizard_add_sub_menu (YGtkWizard *wizard, const char *parent_id, const char *text, const char *id); gboolean ygtk_wizard_add_menu_separator (YGtkWizard *wizard, const char *parent_id); +void ygtk_wizard_clear_menu (YGtkWizard *wizard); void ygtk_wizard_add_step_header (YGtkWizard *wizard, const char *text); void ygtk_wizard_add_step (YGtkWizard *wizard, const char* text, const char *id); @@ -162,9 +167,7 @@ gboolean ygtk_wizard_select_tree_item (YGtkWizard *wizard, const char *id); const gchar *ygtk_wizard_get_tree_selection (YGtkWizard *wizard); -void ygtk_wizard_set_release_notes_button_label (YGtkWizard *wizard, - const gchar *text, gpointer id, - GDestroyNotify destroy_cb); +void ygtk_wizard_set_release_notes_button_label (YGtkWizard *wizard, const gchar *text); void ygtk_wizard_show_release_notes_button (YGtkWizard *wizard, gboolean enable); // You should call this method rather than GtkWidget's if you want Modified: trunk/gtk/src/ygtkzyppwrapper.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkzyppwrapper.cc?rev=43... ============================================================================== --- trunk/gtk/src/ygtkzyppwrapper.cc (original) +++ trunk/gtk/src/ygtkzyppwrapper.cc Thu Dec 20 21:44:06 2007 @@ -19,7 +19,6 @@ #include "icons/pkg-remove.xpm" #include "icons/pkg-install-auto.xpm" #include "icons/pkg-remove-auto.xpm" -#include "icons/pkg-3D.xpm" // bridge as we don't want to mix c++ class polymorphism and gobject struct YGtkZyppModel::PoolNotify : public Ypp::Pool::Listener { @@ -36,8 +35,7 @@ struct PackageIcons { GdkPixbuf *installed, *installed_upgradable, *installed_locked, *installed_upgradable_locked, *available, *available_locked, - *to_install, *to_remove, *to_auto_install, *to_auto_remove, - *is_3D; + *to_install, *to_remove, *to_auto_install, *to_auto_remove; PackageIcons() { installed = gdk_pixbuf_new_from_xpm_data (pkg_installed_xpm); installed_upgradable = @@ -51,7 +49,6 @@ to_remove = gdk_pixbuf_new_from_xpm_data (pkg_remove_xpm); to_auto_install = gdk_pixbuf_new_from_xpm_data (pkg_install_auto_xpm); to_auto_remove = gdk_pixbuf_new_from_xpm_data (pkg_remove_auto_xpm); - is_3D = gdk_pixbuf_new_from_xpm_data (pkg_3D_xpm); } ~PackageIcons() { g_object_unref (G_OBJECT (installed)); @@ -64,7 +61,6 @@ g_object_unref (G_OBJECT (to_remove)); g_object_unref (G_OBJECT (to_auto_install)); g_object_unref (G_OBJECT (to_auto_remove)); - g_object_unref (G_OBJECT (is_3D)); } }; @@ -115,7 +111,6 @@ { YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model); int row = zmodel->pool->getIndex (iter->user_data); -fprintf (stderr, "get index: %d\n", row); GtkTreePath *path = gtk_tree_path_new(); gtk_tree_path_append_index (path, row); @@ -140,13 +135,10 @@ void ygtk_zypp_model_entry_inserted (YGtkZyppModel *model, Ypp::Pool::Iter it) { -fprintf (stderr, "inserted row\n"); GtkTreeIter iter; iter.user_data = it; GtkTreePath *path = ygtk_zypp_model_get_path (GTK_TREE_MODEL (model), &iter); -fprintf (stderr, "signal\n"); gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter); -fprintf (stderr, "done\n"); gtk_tree_path_free (path); } @@ -175,8 +167,6 @@ return G_TYPE_STRING; case YGtkZyppModel::PTR_COLUMN: return G_TYPE_POINTER; - case YGtkZyppModel::SPECIAL_ICON_COLUMN: - return GDK_TYPE_PIXBUF; } return 0; } @@ -257,14 +247,6 @@ g_value_set_pointer (value, ptr); break; } - case YGtkZyppModel::SPECIAL_ICON_COLUMN: - { - if (package->is3D()) - g_value_set_object (value, (GObject *) icons->is_3D); - else - g_value_set_object (value, NULL); - break; - } default: g_warning ("YGtkZyppModel column %d doesn't exist.", column); break; Modified: trunk/gtk/src/ygtkzyppwrapper.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkzyppwrapper.h?rev=432... ============================================================================== --- trunk/gtk/src/ygtkzyppwrapper.h (original) +++ trunk/gtk/src/ygtkzyppwrapper.h Thu Dec 20 21:44:06 2007 @@ -26,8 +26,7 @@ GObject parent; enum Columns { - ICON_COLUMN, NAME_COLUMN, NAME_DESCRIPTION_COLUMN, PTR_COLUMN, - SPECIAL_ICON_COLUMN, TOTAL_COLUMNS + ICON_COLUMN, NAME_COLUMN, NAME_DESCRIPTION_COLUMN, PTR_COLUMN, TOTAL_COLUMNS }; Ypp::Pool *pool; Modified: trunk/gtk/src/yzyppwrapper.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/yzyppwrapper.cc?rev=43216... ============================================================================== --- trunk/gtk/src/yzyppwrapper.cc (original) +++ trunk/gtk/src/yzyppwrapper.cc Thu Dec 20 21:44:06 2007 @@ -156,7 +156,7 @@ private: bool resolveProblems(); - Node *addCategory (Package::Type type, const std::string &str, Package *package); + Node *addCategory (Ypp::Package::Type type, const std::string &str); void polishCategories (Ypp::Package::Type type); void startTransactions(); @@ -177,8 +177,9 @@ struct Ypp::Package::Impl { - Impl (ZyppSelectable sel) - : zyppSel (sel), index (-1), availableVersions (NULL), installedVersion (NULL), is3D (false) + Impl (Type type, ZyppSelectable sel, Node *category) + : type (type), zyppSel (sel), category (category), + availableVersions (NULL), installedVersion (NULL) { // don't use getAvailableVersion(0) for hasUpgrade() has its inneficient. // let's just cache candidate() at start, which should point to the newest version. @@ -204,14 +205,12 @@ { curStatus = zyppSel->status(); } std::string name, summary; - ZyppSelectable zyppSel; - int index; // used for Pools syncing Type type; + ZyppSelectable zyppSel; Ypp::Node *category; GSList *availableVersions; Version *installedVersion; bool hasUpgrade; - bool is3D; zypp::ui::Status curStatus; // so we know if resolver touched it }; @@ -233,10 +232,13 @@ switch (impl->type) { case PATTERN_TYPE: ret = obj->summary(); + break; case LANGUAGE_TYPE: ret = obj->description(); + break; default: ret = sel->name(); + break; } } return ret; @@ -274,11 +276,15 @@ ZyppPackage package = tryCastToZyppPkg (object); std::string url = package->url(), license = package->license(); if (!url.empty()) - text += br + _("Website: ") + url; + text += br + "<b>" + _("Website: ") + "</b>" + url; if (!license.empty()) - text += br + _("License: ") + license; + text += br + "<b>" + _("License: ") + "</b>" + license; + } + else if (impl->type == PATCH_TYPE) { + } - text += br + _("Size: ") + object->size().asString(); + if (impl->type != PATCH_TYPE) + text += br + "<b>" + _("Size: ") + "</b>" + object->size().asString(); return text; } @@ -367,7 +373,6 @@ std::string Ypp::Package::authors() { -fprintf (stderr, "authors %s\n", name().c_str()); std::string text; ZyppObject object = impl->zyppSel->theObj(); ZyppPackage package = tryCastToZyppPkg (object); @@ -382,7 +387,6 @@ if (!authors.empty()) authors += "<br>"; authors += author; -fprintf (stderr, "\t add author %s\n", author.c_str()); } // Some packagers put Authors over the Descriptions field. This seems to be rare // on, so I'm not even going to bother. @@ -428,14 +432,53 @@ return impl->category; } -bool Ypp::Package::is3D() +bool Ypp::Package::fromCollection (Ypp::Package *collection) { - return impl->is3D; + switch (collection->type()) { + case Ypp::Package::PATTERN_TYPE: + { + ZyppSelectable selectable = collection->impl->zyppSel; + ZyppObject object = selectable->theObj(); + ZyppPattern pattern = tryCastToZyppPattern (object); + + const set <string> &packages = pattern->install_packages(); + for (set <string>::iterator it = packages.begin(); + it != packages.end(); it++) { + if (this->impl->zyppSel->name() == *it) + return true; + } + break; + } + case Ypp::Package::LANGUAGE_TYPE: + { + ZyppSelectable selectable = collection->impl->zyppSel; + ZyppObject object = selectable->theObj(); + ZyppLanguage language = tryCastToZyppLanguage (object); + + ZyppObject pkgobj = this->impl->zyppSel->theObj(); + const zypp::CapSet &capSet = pkgobj->dep (zypp::Dep::FRESHENS); + for (zypp::CapSet::const_iterator it = capSet.begin(); + it != capSet.end(); it++) { + if (it->index() == language->name()) + return true; + } + } + default: + break; + } + return false; } - bool Ypp::Package::isInstalled() { + if (impl->type == Ypp::Package::PATCH_TYPE) { + if (impl->zyppSel->hasInstalledObj()) { + // broken? show as available + if (impl->zyppSel->installedPoolItem().status().isIncomplete()) + return false; + } + } + return impl->zyppSel->hasInstalledObj(); } @@ -703,6 +746,7 @@ Key <bool> hasUpgrade; Key <bool> isModified; Key <std::list <int> > onRepositories; + Key <Ypp::Package *> onCollection; Impl() {} @@ -731,6 +775,8 @@ } } } + if (match && onCollection.defined) + match = package->fromCollection (onCollection.value); if (match && category.defined) { Ypp::Node *query_category = category.value; Ypp::Node *pkg_category = package->category(); @@ -750,14 +796,13 @@ } }; -Ypp::Query::Query (Ypp::Package::Type type) -{ - impl = new Impl(); - impl->type.define (type); -} +Ypp::Query::Query() +{ impl = new Impl(); } Ypp::Query::~Query() { delete impl; } +void Ypp::Query::setType (Ypp::Package::Type value) +{ impl->type.define (value); } void Ypp::Query::setName (std::string value) { impl->name.define (YGUtils::splitString (value, ' ')); } void Ypp::Query::setCategory (Ypp::Node *value) @@ -770,6 +815,8 @@ { impl->isModified.define (value); } void Ypp::Query::setRepositories (std::list <int> value) { impl->onRepositories.define (value); } +void Ypp::Query::setCollection (Ypp::Package *value) +{ impl->onCollection.define (value); } //** Pool @@ -783,13 +830,11 @@ : query (query), listener (NULL) { packages = buildPool (query); -fprintf (stderr, "created pool, adding to Ypp\n"); ypp->impl->addPool (this); } ~Impl() { -fprintf (stderr, "destroyed pool, removing from Ypp\n"); ypp->impl->removePool (this); delete query; g_slist_free (packages); @@ -798,31 +843,24 @@ void packageModified (Package *package) { bool match = query->impl->match (package); - int cmp = 1; GSList *i; for (i = packages; i; i = i->next) { - Package *pkg = (Package *) i->data; - if (pkg->impl->index == package->impl->index) - cmp = 0; - if (pkg->impl->index >= package->impl->index) + if (package == i->data) break; } - if (cmp == 0) { + if (i) { // is on pool if (match) { // modified -fprintf (stderr, "pool (%d) - touched: %s\n", g_slist_length (packages), package->name().c_str()); if (listener) listener->entryChanged ((Iter) i, package); } else { // removed -fprintf (stderr, "pool (%d) - remove: %s\n", g_slist_length (packages), package->name().c_str()); if (listener) listener->entryDeleted ((Iter) i, package); packages = g_slist_delete_link (packages, i); } } - else { + else { // not on pool if (match) { // inserted -fprintf (stderr, "pool (%d) - insert: %s\n", g_slist_length (packages), package->name().c_str()); if (i == NULL) { packages = g_slist_append (packages, (gpointer) package); i = g_slist_last (packages); @@ -841,19 +879,17 @@ private: static GSList *buildPool (Query *query) // at construction { -long time1 = time(NULL); -fprintf (stderr, "build pool...\n"); GSList *pool = NULL; - GSList *entire_pool = ypp->impl->getPackages (query->impl->type.value); - int index = 0; - for (GSList *i = entire_pool; i; i = i->next) { - Package *pkg = (Package *) i->data; - if (query->impl->match (pkg)) - pool = g_slist_append (pool, i->data); - if (pkg->impl->index == -1) - pkg->impl->index = index++; + for (int t = 0; t < Ypp::Package::TOTAL_TYPES; t++) { + if (!query->impl->type.is ((Ypp::Package::Type) t)) + continue; + GSList *entire_pool = ypp->impl->getPackages ((Ypp::Package::Type) t); + for (GSList *i = entire_pool; i; i = i->next) { + Package *pkg = (Package *) i->data; + if (query->impl->match (pkg)) + pool = g_slist_append (pool, i->data); + } } -fprintf (stderr, "delta time: %ld\n", time(NULL)-time1); return pool; } }; @@ -956,6 +992,8 @@ Ypp::Node *Ypp::getFirstCategory (Ypp::Package::Type type) { + if (!impl->getPackages (type)) + return NULL; return impl->categories[type]->getFirst(); } @@ -973,54 +1011,7 @@ return NULL; } -struct CatConversor { - const char *from, *to; -}; -static const CatConversor catConversor[] = { - { "Amusements/Games/3D", "Games/Action" }, - { "Amusements/Games/Board/Puzzle", "Games/Logic" }, - { "Amusements/Games/Board/Card", "Games/Card" }, - { "Amusements/Games", "Games" }, - { "Amusements", "Games" }, - { "Applications/Publishing", "Office" }, - { "Applications/Internet", "Network" }, - { "Applications", "" }, - { "Development/C", "Development/Libraries/C and C++" }, - { "Development/Python", "Development/Libraries/Python" }, - { "Development/Libraries/C", "Development/Libraries/C and C++" }, - { "Libraries", "Development/Libraries" }, - { "Productivity/Multimedia/Player", "Multimedia/Sound/Players" }, - { "Productivity/Multimedia/Audio", "Multimedia/Sound/Players" }, - { "Video", "Multimedia/Video" }, - { "Productivity/Multimedia", "Multimedia" }, - { "Productivity/Graphics", "Multimedia/Graphics" }, - { "Productivity/Networking", "Network" }, - { "Productivity/Network", "Network" }, - { "Productivity/Office", "Office" }, - { "Productivity/Publishing", "Office/Publishing" }, - { "Productivity/Telephony", "Network/Telephony" }, - { "Productivity", "Utilities" }, - { "System/Emulators", "Emulators" }, - { "System/GUI", "Utilities/GUI" }, - { "System/Video", "Emulators" }, - { "System/Libraries", "Development/Libraries/C and C++/System" }, - { "X11/Applications/Multimedia", "Multimedia" }, - { "X11/GNOME/Multimedia", "Multimedia" }, - { "X11/Applications", "Utilities/GUI" }, -}; -#define CAT_CONVERSOR_SIZE (sizeof (catConversor)/sizeof (CatConversor)) -struct TypoConversor { - const char *from, *to, len; -}; -static const TypoConversor catTypos[] = { - { "Others", "Other", 6 }, { "Utilites", "Utilities", 8 }, - { "AOLInstantMessenge", "AOLInstantMessenger", 18 }, - { "Library", "Libraries", 7 }, { "Libs", "Libraries", 4 }, -}; -#define CAT_TYPOS_SIZE (sizeof (catTypos)/sizeof (TypoConversor)) - -Ypp::Node *Ypp::Impl::addCategory (Ypp::Package::Type type, - const std::string &category_str, Package *pkg) +Ypp::Node *Ypp::Impl::addCategory (Ypp::Package::Type type, const std::string &category_str) { struct inner { static int cmp (const char *a, const char *b) @@ -1032,59 +1023,17 @@ return -1; return YGUtils::strcmp (a, b); } - - // Package categories guide-line don't seem to be enforced, some categories - // are duplicated, or don't make much sense. Let's try to cut on that. - - static std::string treatCategory (const std::string &category, Package *pkg) - { - std::string ret (category); - - // typos (end group only) - for (unsigned int c = 0; c < CAT_TYPOS_SIZE; c++) { - const char *from = catTypos[c].from, from_len = catTypos[c].len; - int ret_index = ret.length() - from_len; - - if (ret_index >= 0 && ret.compare (ret_index, from_len, from, from_len) == 0) { - const char *to = catTypos[c].to; - ret.erase (ret_index); - ret.append (to); - break; - } - } - - for (unsigned int c = 0; c < CAT_CONVERSOR_SIZE; c++) { - const char *from = catConversor[c].from; - unsigned int i; - for (i = 0; from[i] && i < ret.length(); i++) - if (from[i] != ret[i]) - break; - if (!from[i] && (i == ret.length() || ret[i] == '/')) { - const char *to = catConversor[c].to; - ret.erase (0, i); - ret.insert (0, to); - if (c == 0 && pkg) - pkg->impl->is3D = true; - break; - } - } - return ret; - } }; if (!categories[type]) categories[type] = new StringTree (inner::cmp, '/'); - if (type == Package::PACKAGE_TYPE) - return categories[type]->add (inner::treatCategory (category_str, pkg)); - else - return categories[type]->add (category_str); + return categories[type]->add (category_str); } void Ypp::Impl::polishCategories (Ypp::Package::Type type) { // some treatment on categories - // Put all packages under a node (as opposite to packages on a leaf) to - // the Other category. + // Packages must be on leaves. If not, create a "Other" leaf, and put it there. if (type == Package::PACKAGE_TYPE) { GSList *pool = ypp->impl->getPackages (type); for (GSList *i = pool; i; i = i->next) { @@ -1097,7 +1046,6 @@ pkg->impl->category = (Ypp::Node *) last->data; else { // must create a "Other" node - fprintf (stderr, "creating Other\n"); Ypp::Node *yN = new Ypp::Node(); GNode *n = g_node_new ((void *) yN); yN->name = "Other"; @@ -1229,20 +1177,21 @@ resolved = interface->resolveProblems (problems); - zypp::ProblemSolutionList choices; - for (std::list <Problem *>::iterator it = problems.begin(); - it != problems.end(); it++) { - for (int i = 0; (*it)->getSolution (i); i++) { - Problem::Solution *solution = (*it)->getSolution (i); - if (resolved && solution->apply) - choices.push_back ((zypp::ProblemSolution *) solution->impl); - delete solution; + if (resolved) { + zypp::ProblemSolutionList choices; + for (std::list <Problem *>::iterator it = problems.begin(); + it != problems.end(); it++) { + for (int i = 0; (*it)->getSolution (i); i++) { + Problem::Solution *solution = (*it)->getSolution (i); + if (resolved && solution->apply) + choices.push_back ((zypp::ProblemSolution *) solution->impl); + delete solution; + } + delete *it; } - delete *it; - } - if (resolved) zResolver->applySolutions (choices); + } else break; } @@ -1255,16 +1204,15 @@ void Ypp::Impl::packageModified (Ypp::Package *package) { // notify listeners of package change - for (GSList *i = pools; i; i = i->next) { -fprintf (stderr, "ypp: informing pool of package modified\n"); + for (GSList *i = pools; i; i = i->next) ((Pool::Impl *) i->data)->packageModified (package); - } if (disk) disk->impl->packageModified (package); if (interface) interface->packageModified (package); - transactions = g_slist_append (transactions, package); + if (!g_slist_find (transactions, package)) /* could be a result of undo */ + transactions = g_slist_append (transactions, package); if (!inTransaction) finishTransactions(); } @@ -1300,79 +1248,13 @@ } void Ypp::Impl::addPool (Pool::Impl *pool) -{ fprintf (stderr, "ypp: adding pool\n"); pools = g_slist_append (pools, pool); } +{ pools = g_slist_append (pools, pool); } void Ypp::Impl::removePool (Pool::Impl *pool) -{ fprintf (stderr, "ypp: removing pool\n"); pools = g_slist_remove (pools, pool); } - -#if 0 -// using auxiliary GSequence tree -- not yet shiped by Glib :X -// in any case, a sort merge is very fast, as packages are more or less -// sorted anyway... -GSList *Ypp::Impl::getPackages (Ypp::Package::Type type) -{ - if (!packages[type]) { - // auxiliary for efficient alphabetic sorting - GSequence *pool = g_sequence_new (NULL); - struct inner { - static gint compare (gconstpointer _a, gconstpointer _b, gpointer _data) - { - Package *a = (Package *) _a; - Package *b = (Package *) _b; - return YGUtils::strcmp (a->name().c_str(), b->name().c_str()); - } -/* static void pool_foreach (gpointer data, gpointer _list) - { - GSList **list = (GSList **) _list; - *list = g_slist_append (*list, data); - }*/ - }; - - ZyppPool::const_iterator it, end; - switch (type) - { - case Package::PACKAGE_TYPE: - it = zyppPool().byKindBegin <zypp::Package>(); - end = zyppPool().byKindEnd <zypp::Package>(); - break; - case Package::PATTERN_TYPE: - it = zyppPool().byKindBegin <zypp::Pattern>(); - end = zyppPool().byKindEnd <zypp::Pattern>(); - break; - case Package::LANGUAGE_TYPE: - it = zyppPool().byKindBegin <zypp::Language>(); - end = zyppPool().byKindEnd <zypp::Language>(); - break; - default: - break; - } - for (; it != end; it++) - { - Package *package = new Package (new Package::Impl (*it)); - g_sequence_insert_sorted (pool, package, inner::compare, NULL); - } - - // add stuff to the actual pool now - int index = 0; - for (GSequenceIter *it = g_sequence_get_begin_iter (pool); - !g_sequence_iter_is_end (it); it = g_sequence_iter_next (it)) { - gpointer data = g_sequence_get (it); - Package *pkg = (Package *) data; - pkg->impl->index = index++; - pkg->impl->type = type; - packages[type] = g_slist_append (packages[type], data); - } +{ pools = g_slist_remove (pools, pool); } -// g_sequence_foreach (pool, inner::pool_foreach, &); - g_sequence_free (pool); - } - return packages[type]; -} -#else GSList *Ypp::Impl::getPackages (Ypp::Package::Type type) { if (!packages[type]) { -long time1 = time(NULL); -fprintf (stderr, "creating pool of %d...\n", type); GSList *pool = NULL; struct inner { static gint compare (gconstpointer _a, gconstpointer _b) @@ -1397,29 +1279,50 @@ it = zyppPool().byKindBegin <zypp::Language>(); end = zyppPool().byKindEnd <zypp::Language>(); break; + case Package::PATCH_TYPE: + it = zyppPool().byKindBegin <zypp::Patch>(); + end = zyppPool().byKindEnd <zypp::Patch>(); + break; default: break; } for (; it != end; it++) { - Package *package = new Package (new Package::Impl (*it)); Ypp::Node *category = 0; - if (type == Package::PACKAGE_TYPE) { - ZyppObject object = (*it)->theObj(); - ZyppPackage zpackage = tryCastToZyppPkg (object); - if (!zpackage) - continue; - category = addCategory (type, zpackage->group(), package); - } - else if (type == Package::PATTERN_TYPE) { - ZyppObject object = (*it)->theObj(); - ZyppPattern pattern = tryCastToZyppPattern (object); - if (!pattern || !pattern->userVisible()) - continue; - category = addCategory (type, pattern->category(), 0); + ZyppObject object = (*it)->theObj(); + // add category and test visibility + switch (type) { + case Package::PACKAGE_TYPE: + { + ZyppPackage zpackage = tryCastToZyppPkg (object); + if (!zpackage) + continue; + category = addCategory (type, zpackage->group()); + break; + } + case Package::PATTERN_TYPE: + { + ZyppPattern pattern = tryCastToZyppPattern (object); + if (!pattern || !pattern->userVisible()) + continue; + category = addCategory (type, pattern->category()); + break; + } + case Package::PATCH_TYPE: + { + ZyppPatch patch = tryCastToZyppPatch (object); + if (!patch) + continue; + if (!(*it)->hasInstalledObj()) + if (!(*it)->hasCandidateObj() || !(*it)->candidatePoolItem().status().isNeeded()) + continue; + category = addCategory (type, patch->category()); + break; + } + default: + break; } - package->impl->type = type; - package->impl->category = category; + Package *package = new Package (new Package::Impl (type, *it, category)); pool = g_slist_prepend (pool, package); } // its faster to prepend then reverse, as we avoid iterating for each append @@ -1430,11 +1333,9 @@ packages[type] = pool; polishCategories (type); -fprintf (stderr, "delta time: %ld\n", time(NULL)-time1); } return packages[type]; } -#endif Ypp::Ypp() { Modified: trunk/gtk/src/yzyppwrapper.h URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/yzyppwrapper.h?rev=43216&... ============================================================================== --- trunk/gtk/src/yzyppwrapper.h (original) +++ trunk/gtk/src/yzyppwrapper.h Thu Dec 20 21:44:06 2007 @@ -38,14 +38,14 @@ // Entries struct Package { enum Type { - PACKAGE_TYPE, PATTERN_TYPE, LANGUAGE_TYPE, TOTAL_TYPES + PACKAGE_TYPE, PATTERN_TYPE, LANGUAGE_TYPE, PATCH_TYPE, TOTAL_TYPES }; Type type(); const std::string &name(); const std::string &summary(); Node *category(); - bool is3D(); + bool fromCollection (Ypp::Package *package); std::string description(); std::string filelist(); @@ -93,13 +93,15 @@ // Query struct Query { - Query (Package::Type type); + Query(); + void setType (Package::Type type); void setName (std::string name); void setCategory (Ypp::Node *category); void setIsInstalled (bool installed); void setHasUpgrade (bool upgradable); void setIsModified (bool modified); void setRepositories (std::list <int> repositories); + void setCollection (Ypp::Package *package); ~Query(); struct Impl; @@ -118,9 +120,9 @@ Iter getIter (int index); struct Listener { - virtual void entryChanged (Iter iter, Package *package) = 0; virtual void entryInserted (Iter iter, Package *package) = 0; virtual void entryDeleted (Iter iter, Package *package) = 0; + virtual void entryChanged (Iter iter, Package *package) = 0; }; void setListener (Listener *listener); -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org
participants (1)
-
rpmcruz@svn.opensuse.org