Author: rpmcruz
Date: Sun Feb 3 02:23:04 2008
New Revision: 44119
URL: http://svn.opensuse.org/viewcvs/yast?rev=44119&view=rev
Log:
* src/yzyppwrapper.cc: bug fix: licenses were being rejected regardless
user's acceptance.
* src/YGPackageSelector.cc: Christian Jäger asked for an Update All button.
Added a context menu to the listing, that has among package actions, a Select
All item, so to make it clear it supports multi-selections and one can easily
select-all then the upgrade button.
* src/YGDialog.cc: keep up with libyui changes.
Modified:
trunk/gtk/ChangeLog
trunk/gtk/src/YGDialog.cc
trunk/gtk/src/YGDialog.h
trunk/gtk/src/YGPackageSelector.cc
trunk/gtk/src/YGUI.cc
trunk/gtk/src/YGUI.h
trunk/gtk/src/yzyppwrapper.cc
Modified: trunk/gtk/ChangeLog
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/ChangeLog?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/ChangeLog (original)
+++ trunk/gtk/ChangeLog Sun Feb 3 02:23:04 2008
@@ -1,3 +1,19 @@
+2008-02-03 Ricardo Cruz
+
+ * src/yzyppwrapper.cc: bug fix: licenses were being rejected regardless
+ user's acceptance.
+
+ * src/YGPackageSelector.cc: Christian Jäger asked for an Update All button.
+ Added a context menu to the listing, that has among package actions, a Select
+ All item, so to make it clear it supports multi-selections and one can easily
+ select-all then the upgrade button.
+
+ * src/YGDialog.cc: keep up with libyui changes.
+
+2008-02-03 Stephan Kulow
+
+ * src/YGUI.cc/h: maintaince: keep up with libyui changes.
+
2008-01-24 Ricardo Cruz
* src/YGDumbTab.cc: bug fix: honor tab default flag.
Modified: trunk/gtk/src/YGDialog.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGDialog.cc?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/YGDialog.cc (original)
+++ trunk/gtk/src/YGDialog.cc Sun Feb 3 02:23:04 2008
@@ -55,7 +55,6 @@
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");
@@ -85,6 +84,9 @@
G_CALLBACK (close_window_cb), this);
g_signal_connect_after (G_OBJECT (m_widget), "key-press-event",
G_CALLBACK (key_pressed_cb), this);
+ // set busy cursor at start
+ g_signal_connect_after (G_OBJECT (m_widget), "realize",
+ G_CALLBACK (realize_cb), this);
}
~YGWindow()
@@ -95,6 +97,31 @@
g_object_unref (G_OBJECT (m_widget));
}
+ void show()
+ { gtk_widget_show (m_widget); }
+
+ void present()
+ { gtk_window_present (GTK_WINDOW (m_widget)); }
+
+ void normalCursor()
+ {
+ if (GTK_WIDGET_REALIZED (m_widget))
+ gdk_window_set_cursor (m_widget->window, NULL);
+ }
+
+ void busyCursor()
+ {
+ if (GTK_WIDGET_REALIZED (m_widget)) {
+ // GdkDisplay won't change for new dialogs
+ static GdkCursor *cursor = NULL;
+ if (!cursor) {
+ GdkDisplay *display = gtk_widget_get_display (m_widget);
+ cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
+ }
+ gdk_window_set_cursor (m_widget->window, cursor);
+ }
+ }
+
void setChild (YWidget *new_child)
{
IMPL
@@ -226,6 +253,9 @@
return TRUE;
}
+ static void realize_cb (GtkWidget *widget, YGWindow *pThis)
+ { pThis->busyCursor(); }
+
static gboolean expode_window_timeout_cb (gpointer data)
{
YGWindow *pThis = (YGWindow *) data;
@@ -233,7 +263,7 @@
srand (time (NULL));
gint x, y;
gtk_window_get_position (window, &x, &y);
- #if 0
+ #if 0
// OVAL MOVE
for (int i = 180; i < 360+180; i++) {
gtk_window_move (window, x+(int)(sin((i*G_PI)/180)*50),
@@ -242,7 +272,7 @@
gtk_main_iteration();
usleep (25);
}
- #else
+ #else
// EXPLOSION
for (int i = 0; i < 40; i++) {
gtk_window_move (window, x+(int)((((float)(rand())/RAND_MAX)*40)-20),
@@ -251,7 +281,7 @@
gtk_main_iteration();
usleep (200);
}
- #endif
+ #endif
gtk_window_move (window, x, y);
return TRUE;
}
@@ -371,19 +401,12 @@
void YGDialog::normalCursor()
{
- gdk_window_set_cursor (m_window->getWidget()->window, NULL);
+ m_window->normalCursor();
}
void YGDialog::busyCursor()
{
- // NOTE: GdkDisplay won't change for new dialogs, so we don't
- // have to synchronize between them or something.
- static GdkCursor *cursor = NULL;
- if (!cursor) {
- GdkDisplay *display = gtk_widget_get_display (m_window->getWidget());
- cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
- }
- gdk_window_set_cursor (m_window->getWidget()->window, cursor);
+ m_window->busyCursor();
}
@@ -421,34 +444,19 @@
return new YGDialog (dialogType, colorMode);
}
-void
-YGDialog::openInternal()
+void YGDialog::openInternal()
{
-#if TESTED
- // Ensure only one default button ?
- gtk_widget_show (m_widget);
- gtk_window_present (GTK_WINDOW (m_widget));
- gtk_widget_queue_draw (m_widget);
-#endif
-#if 0
- ensureOnlyOneDefaultButton();
- QWidget::show();
- QWidget::raise(); // FIXME: is this really necessary?
- QWidget::update();
-#endif
+ m_window->show();
}
-
-void
-YGDialog::activate()
-{
-#if TESTED
- gtk_window_present (GTK_WINDOW (m_widget));
- gtk_widget_queue_draw (m_widget);
-#endif
-#if 0
- QWidget::raise();
- QWidget::update();
-#endif
+void YGDialog::activate()
+{
+ m_window->present();
}
+YEvent *YGDialog::waitForEventInternal (int timeout_millisec)
+{ return YGUI::ui()->userInput (timeout_millisec); }
+
+YEvent *YGDialog::pollEventInternal()
+{ return YGUI::ui()->pollInput(); }
+
Modified: trunk/gtk/src/YGDialog.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGDialog.h?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/YGDialog.h (original)
+++ trunk/gtk/src/YGDialog.h Sun Feb 3 02:23:04 2008
@@ -33,8 +33,11 @@
virtual int preferredWidth() { return 0; }
virtual int preferredHeight() { return 0; }
- virtual void activate();
- virtual void openInternal();
+ virtual void activate();
+ virtual void openInternal();
+
+ virtual YEvent *waitForEventInternal (int timeout_millisec);
+ virtual YEvent *pollEventInternal();
YGWIDGET_IMPL_CHILD_ADDED (m_containee)
YGWIDGET_IMPL_CHILD_REMOVED (m_containee)
Modified: trunk/gtk/src/YGPackageSelector.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGPackageSelector.cc?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/YGPackageSelector.cc (original)
+++ trunk/gtk/src/YGPackageSelector.cc Sun Feb 3 02:23:04 2008
@@ -41,6 +41,136 @@
static void normalCursor()
{ YGUI::ui()->normalCursor(); }
+struct PkgList
+{
+ bool empty() const
+ { return packages.empty(); }
+ bool single() const
+ { return packages.size() == 1; }
+ Ypp::Package *front() const
+ { return packages.front(); }
+
+ bool installed() const
+ { init(); return _allInstalled; }
+ bool notInstalled() const
+ { init(); return _allNotInstalled; }
+ bool upgradable() const
+ { init(); return _allUpgradable; }
+ bool modified() const
+ { init(); return _allModified; }
+ bool locked() const
+ { init(); return _allLocked; }
+ bool unlocked() const
+ { init(); return _allUnlocked; }
+
+ void install() // or upgrade
+ {
+ busyCursor();
+ Ypp::get()->startTransactions();
+ for (std::list ::iterator it = packages.begin();
+ it != packages.end(); it++)
+ (*it)->install (0);
+ Ypp::get()->finishTransactions();
+ normalCursor();
+ }
+
+ void remove()
+ {
+ busyCursor();
+ Ypp::get()->startTransactions();
+ for (std::list ::iterator it = packages.begin();
+ it != packages.end(); it++)
+ (*it)->remove();
+ Ypp::get()->finishTransactions();
+ normalCursor();
+ }
+
+ void lock (bool toLock)
+ {
+ busyCursor();
+ Ypp::get()->startTransactions();
+ for (std::list ::iterator it = packages.begin();
+ it != packages.end(); it++)
+ (*it)->lock (toLock);
+ Ypp::get()->finishTransactions();
+ normalCursor();
+ }
+
+ void undo()
+ {
+ busyCursor();
+ Ypp::get()->startTransactions();
+ for (std::list ::iterator it = packages.begin();
+ it != packages.end(); it++)
+ (*it)->undo();
+ Ypp::get()->finishTransactions();
+ normalCursor();
+ }
+
+ void push (Ypp::Package *package)
+ { packages.push_back (package); }
+
+ bool contains (const Ypp::Package *package) const
+ {
+ const_iterator it;
+ for (it = packages.begin(); it != packages.end(); it++)
+ if (*it == package)
+ return true;
+ return false;
+ }
+
+ PkgList() : inited (0)
+ {}
+
+ typedef std::list ::const_iterator const_iterator;
+ const_iterator begin() const
+ { return packages.begin(); }
+ const_iterator end() const
+ { return packages.end(); }
+
+private:
+ void init() const
+ { PkgList *packages = const_cast (this); packages->_init(); }
+ void _init()
+ {
+ if (inited) return; inited = 1;
+ if (packages.empty())
+ _allInstalled = _allNotInstalled = _allUpgradable = _allModified =
+ _allLocked = _allUnlocked = false;
+ else {
+ _allInstalled = _allNotInstalled = _allUpgradable = _allModified =
+ _allLocked = _allUnlocked = true;
+ for (std::list ::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
+ _allModified = false;
+ if ((*it)->isLocked())
+ _allUnlocked = false;
+ else
+ _allLocked = false;
+ }
+ }
+ }
+
+ std::list packages;
+ guint inited : 2, _allInstalled : 2, _allNotInstalled : 2, _allUpgradable : 2,
+ _allModified : 2, _allLocked : 2, _allUnlocked : 2;
+};
+
#include "icons/pkg-list-mode.xpm"
#include "icons/pkg-tiles-mode.xpm"
@@ -48,7 +178,7 @@
{
public:
struct Listener {
- virtual void packagesSelected (const std::list &selection) = 0;
+ virtual void packagesSelected (const PkgList &packages) = 0;
};
void setListener (Listener *listener)
{ m_listener = listener; }
@@ -56,25 +186,50 @@
private:
Listener *m_listener;
- void packagesSelected (const std::list &selection)
+ void packagesSelected (const PkgList &packages)
{
if (m_listener) {
busyCursor();
- m_listener->packagesSelected (selection);
+ m_listener->packagesSelected (packages);
normalCursor();
}
}
- struct View {
+ struct View
+ {
PackagesView *m_parent;
- GtkWidget *m_widget;
- View (PackagesView *parent) : m_parent (parent)
+ GtkWidget *m_widget, *m_popup_hack;
+ View (PackagesView *parent) : m_parent (parent), m_popup_hack (NULL)
{}
+
+ virtual ~View()
+ {
+ if (m_popup_hack) gtk_widget_destroy (m_popup_hack);
+ }
+
virtual void setModel (GtkTreeModel *model) = 0;
+ virtual GList *getSelectedPaths (GtkTreeModel **model) = 0;
+ virtual void selectAll() = 0;
+
+ virtual int countSelected()
+ {
+ int count = 0;
+ GtkTreeModel *model;
+ GList *paths = getSelectedPaths (&model);
+ for (GList *i = paths; i; i = i->next) {
+ GtkTreePath *path = (GtkTreePath *) i->data;
+ gtk_tree_path_free (path);
+ count++;
+ }
+ g_list_free (paths);
+ return count;
+ }
- void selectedPaths (GtkTreeModel *model, GList *paths)
+ PkgList getSelected()
{
- std::list packages;
+ GtkTreeModel *model;
+ GList *paths = getSelectedPaths (&model);
+ PkgList packages;
for (GList *i = paths; i; i = i->next) {
Ypp::Package *package;
GtkTreePath *path = (GtkTreePath *) i->data;
@@ -83,11 +238,86 @@
gtk_tree_model_get (model, &iter, YGtkZyppModel::PTR_COLUMN, &package, -1);
gtk_tree_path_free (path);
- packages.push_back (package);
+ packages.push (package);
}
g_list_free (paths);
+ return packages;
+ }
+
+ void signalSelected()
+ {
+ PkgList packages = getSelected();
m_parent->packagesSelected (packages);
}
+
+ void signalPopup (int button, int event_time)
+ {
+ // GtkMenu emits "deactivate" before Items notifications, so there isn't
+ // a better way to de-allocate the popup
+ if (m_popup_hack) gtk_widget_destroy (m_popup_hack);
+ GtkWidget *menu = m_popup_hack = gtk_menu_new();
+
+ struct inner {
+ static void appendItem (GtkWidget *menu, const char *label, const char *stock_icon,
+ void (& callback) (GtkMenuItem *item, View *pThis), View *pThis)
+ {
+ GtkWidget *item;
+ if (stock_icon) {
+ if (label) {
+ item = gtk_image_menu_item_new_with_mnemonic (label);
+ GtkWidget *icon;
+ icon = gtk_image_new_from_stock (stock_icon, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), icon);
+ }
+ else
+ item = gtk_image_menu_item_new_from_stock (stock_icon, NULL);
+ }
+ else
+ item = gtk_menu_item_new_with_mnemonic (label);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (callback), pThis);
+ }
+ static void install_cb (GtkMenuItem *item, View *pThis)
+ {
+ PkgList packages = pThis->getSelected();
+ packages.install();
+ }
+ static void remove_cb (GtkMenuItem *item, View *pThis)
+ {
+ PkgList packages = pThis->getSelected();
+ packages.remove();
+ }
+ static void undo_cb (GtkMenuItem *item, View *pThis)
+ {
+ PkgList packages = pThis->getSelected();
+ packages.undo();
+ }
+ static void select_all_cb (GtkMenuItem *item, View *pThis)
+ {
+ pThis->selectAll();
+ }
+ };
+
+ PkgList packages = getSelected();
+ bool empty = true;
+ if (packages.notInstalled())
+ inner::appendItem (menu, _("_Install"), GTK_STOCK_DELETE, inner::install_cb, this), empty = false;
+ if (packages.upgradable())
+ inner::appendItem (menu, _("_Upgrade"), GTK_STOCK_GOTO_TOP, inner::install_cb, this), empty = false;
+ if (packages.installed())
+ inner::appendItem (menu, _("_Remove"), GTK_STOCK_SAVE, inner::remove_cb, this), empty = false;
+ if (packages.modified())
+ inner::appendItem (menu, _("_Undo"), GTK_STOCK_UNDO, inner::undo_cb, this), empty = false;
+ if (!empty)
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new());
+ inner::appendItem (menu, NULL, GTK_STOCK_SELECT_ALL, inner::select_all_cb, this);
+
+ gtk_widget_show_all (menu);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, event_time);
+ }
+
+ static gboolean popup_key_cb (GtkWidget *widget, View *pThis)
+ { pThis->signalPopup (0, gtk_get_current_event_time()); return TRUE; }
};
struct ListView : public View
{
@@ -118,8 +348,13 @@
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
g_signal_connect (G_OBJECT (selection), "changed",
- G_CALLBACK (packages_selected_cb), this);
+ G_CALLBACK (packages_selected_cb), this);
gtk_widget_show (m_widget);
+
+ g_signal_connect (G_OBJECT (m_widget), "popup-menu",
+ G_CALLBACK (popup_key_cb), this);
+ g_signal_connect (G_OBJECT (m_widget), "button-press-event",
+ G_CALLBACK (popup_button_cb), this);
}
virtual void setModel (GtkTreeModel *model)
@@ -129,11 +364,39 @@
gtk_tree_view_scroll_to_point (GTK_TREE_VIEW (m_widget), 0, 0);
}
+ GtkTreeSelection *getTreeSelection()
+ { return gtk_tree_view_get_selection (GTK_TREE_VIEW (m_widget)); }
+
+ virtual GList *getSelectedPaths (GtkTreeModel **model)
+ { return gtk_tree_selection_get_selected_rows (getTreeSelection(), model); }
+
+ virtual void selectAll()
+ { gtk_tree_selection_select_all (getTreeSelection()); }
+
+ virtual int countSelected()
+ { return gtk_tree_selection_count_selected_rows (getTreeSelection()); }
+
static void packages_selected_cb (GtkTreeSelection *selection, View *pThis)
+ { pThis->signalSelected(); }
+
+ static gboolean popup_button_cb (GtkWidget *widget, GdkEventButton *event, View *pThis)
{
- GtkTreeModel *model;
- GList *paths = gtk_tree_selection_get_selected_rows (selection, &model);
- pThis->selectedPaths (model, paths);
+ // workaround (based on gedit): we want the tree view to receive this press in order
+ // to select the row, but we can't use connect_after, so we throw a dummy mouse press
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
+ static bool safeguard = false;
+ if (safeguard) return false;
+ safeguard = true;
+ if (pThis->countSelected() <= 1) { // if there is a selection, let it be
+ event->button = 1;
+ if (!gtk_widget_event (widget, (GdkEvent *) event))
+ return FALSE;
+ }
+ pThis->signalPopup (3, event->time);
+ safeguard = false;
+ return TRUE;
+ }
+ return FALSE;
}
};
struct IconView : public View
@@ -148,6 +411,11 @@
g_signal_connect (G_OBJECT (m_widget), "selection-changed",
G_CALLBACK (packages_selected_cb), this);
gtk_widget_show (m_widget);
+
+ g_signal_connect (G_OBJECT (m_widget), "popup-menu",
+ G_CALLBACK (popup_key_cb), this);
+ g_signal_connect_after (G_OBJECT (m_widget), "button-press-event",
+ G_CALLBACK (popup_button_after_cb), this);
}
virtual void setModel (GtkTreeModel *model)
@@ -161,11 +429,26 @@
}
}
- static void packages_selected_cb (GtkIconView *view, View *pThis)
+ virtual GList *getSelectedPaths (GtkTreeModel **model)
{
- GtkTreeModel *model = gtk_icon_view_get_model (view);
+ GtkIconView *view = GTK_ICON_VIEW (m_widget);
+ *model = gtk_icon_view_get_model (view);
GList *paths = gtk_icon_view_get_selected_items (view);
- pThis->selectedPaths (model, paths);
+ return paths;
+ }
+
+ virtual void selectAll()
+ { gtk_icon_view_select_all (GTK_ICON_VIEW (m_widget)); }
+
+ static void packages_selected_cb (GtkIconView *view, View *pThis)
+ { pThis->signalSelected(); }
+
+ static gboolean popup_button_after_cb (GtkWidget *widget, GdkEventButton *event,
+ View *pThis)
+ {
+ if (event->type == GDK_BUTTON_PRESS && event->button == 3)
+ pThis->signalPopup (3, event->time);
+ return FALSE;
}
};
@@ -217,7 +500,7 @@
if (m_model)
m_view->setModel (m_model);
- packagesSelected (std::list ());
+ packagesSelected (PkgList());
normalCursor();
}
@@ -233,11 +516,14 @@
m_model = GTK_TREE_MODEL (zmodel);
if (m_view) {
m_view->setModel (m_model);
- packagesSelected (std::list ());
+ packagesSelected (PkgList());
}
normalCursor();
}
+ PkgList getSelected()
+ { return m_view->getSelected(); }
+
private:
GtkWidget *create_toggle_button (const char **xpm, const char *tooltip, GtkWidget *member)
{
@@ -322,6 +608,7 @@
else
gtk_widget_show (m_button);
gtk_label_set_text (GTK_LABEL (m_label), text.c_str());
+ gtk_widget_set_tooltip_text (m_label, package->summary().c_str());
}
static void undo_clicked_cb (GtkButton *button, Ypp::Package *package)
@@ -671,28 +958,25 @@
gtk_box_pack_start (GTK_BOX (m_box), m_buttons_box, FALSE, TRUE, 0);
}
- std::list m_selected;
-
- virtual void packagesSelected (const std::list &selection)
+ virtual void packagesSelected (const PkgList &selection)
{
gtk_widget_set_sensitive (m_buttons_box, !selection.empty());
- m_selected = selection;
m_filters->signalChanged();
}
virtual void writeQuery (Ypp::Query *query)
{
- for (std::list ::const_iterator it = m_selected.begin();
- it != m_selected.end(); it++)
+ PkgList selected = m_view->getSelected();
+ for (PkgList::const_iterator it = selected.begin();
+ it != selected.end(); it++)
query->addCollection (*it);
}
void doAll (bool install /*or remove*/)
{
// we just need to mark the collections themselves
- for (std::list ::iterator it = m_selected.begin();
- it != m_selected.end(); it++)
- install ? (*it)->install(0) : (*it)->remove();
+ PkgList selected = m_view->getSelected();
+ install ? selected.install() : selected.remove();
}
static void install_cb (GtkButton *button, Pool *pThis)
@@ -981,7 +1265,7 @@
*m_unlocked_image, *m_package_image;
public:
-std::list m_packages; // we keep a copy to test against modified...
+PkgList m_packages; // we keep a copy to test against modified...
Filters *m_filters; // used to filter repo versions...
GtkWidget *getWidget()
@@ -1077,40 +1361,15 @@
g_object_unref (G_OBJECT (m_unlocked_image));
}
- void setPackages (const std::list &packages)
+ void setPackages (const PkgList &packages)
{
m_packages = packages;
if (packages.empty())
return;
- Ypp::Package *single_package = packages.size() == 1 ? packages.front() : NULL;
- bool allInstalled = true, allNotInstalled = true, allUpgradable = true,
- allModified = true, allLocked = true, allUnlocked = true;
- for (std::list ::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
- allModified = false;
- if ((*it)->isLocked())
- allUnlocked = false;
- else
- allLocked = false;
- }
+ Ypp::Package *single_package = packages.single() ? packages.front() : NULL;
- if (allInstalled) {
+ if (packages.installed()) {
gtk_widget_show (m_remove_button);
if (single_package)
gtk_label_set_text (GTK_LABEL (m_installed_version),
@@ -1147,12 +1406,12 @@
gtk_widget_hide (m_install_button);
}
else {
- if (allUpgradable) {
+ if (packages.upgradable()) {
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) {
+ else if (packages.notInstalled()) {
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"));
@@ -1162,13 +1421,13 @@
}
// is locked
- if (allLocked || allUnlocked) {
+ if (packages.locked() || packages.unlocked()) {
gtk_widget_show (m_lock_button);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_lock_button), allLocked);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_lock_button), packages.locked());
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);
+ packages.locked() ? m_locked_image : m_unlocked_image);
+ gtk_widget_set_sensitive (m_install_button, !packages.locked());
+ gtk_widget_set_sensitive (m_remove_button, !packages.locked());
}
else {
gtk_widget_hide (m_lock_button);
@@ -1176,7 +1435,7 @@
gtk_widget_set_sensitive (m_remove_button, TRUE);
}
- if (allModified)
+ if (packages.modified())
gtk_widget_show (m_undo_button);
else
gtk_widget_hide (m_undo_button);
@@ -1196,59 +1455,37 @@
private:
static void install_clicked_cb (GtkButton *button, PackageControl *pThis)
{
- busyCursor();
- Ypp::get()->startTransactions();
- for (std::list ::iterator it = pThis->m_packages.begin();
- it != pThis->m_packages.end(); it++) {
- int version;
- if (GTK_WIDGET_VISIBLE (pThis->m_available_versions))
- version = gtk_combo_box_get_active (GTK_COMBO_BOX (
+ if (pThis->m_packages.single()) {
+ busyCursor();
+ Ypp::Package *package = pThis->m_packages.front();
+ int version = gtk_combo_box_get_active (GTK_COMBO_BOX (
pThis->m_available_versions));
- else
- version = 0; // i.e. most recent (on multi-packages)
- (*it)->install (version);
+ package->install (version);
+ normalCursor();
}
- Ypp::get()->finishTransactions();
- normalCursor();
+ else
+ pThis->m_packages.install();
}
static void remove_clicked_cb (GtkButton *button, PackageControl *pThis)
{
- busyCursor();
- Ypp::get()->startTransactions();
- for (std::list ::iterator it = pThis->m_packages.begin();
- it != pThis->m_packages.end(); it++)
- (*it)->remove();
- Ypp::get()->finishTransactions();
- normalCursor();
+ pThis->m_packages.remove();
}
static void locked_toggled_cb (GtkToggleButton *button, PackageControl *pThis)
{
bool lock = gtk_toggle_button_get_active (button);
- busyCursor();
- Ypp::get()->startTransactions();
- for (std::list ::iterator it = pThis->m_packages.begin();
- it != pThis->m_packages.end(); it++)
- (*it)->lock (lock);
- Ypp::get()->finishTransactions();
- normalCursor();
+ pThis->m_packages.lock (lock);
}
static void undo_clicked_cb (GtkButton *button, PackageControl *pThis)
{
- busyCursor();
- Ypp::get()->startTransactions();
- for (std::list ::iterator it = pThis->m_packages.begin();
- it != pThis->m_packages.end(); it++)
- (*it)->undo();
- Ypp::get()->finishTransactions();
- normalCursor();
+ pThis->m_packages.undo();
}
static void version_changed_cb (GtkComboBox *combo, PackageControl *pThis)
{
- if (pThis->m_packages.size() == 1) {
+ if (pThis->m_packages.single()) {
Ypp::Package *package = pThis->m_packages.front();
int nb = gtk_combo_box_get_active (GTK_COMBO_BOX (pThis->m_available_versions));
if (nb == -1) return;
@@ -1310,7 +1547,7 @@
}
}
- void setPackages (std::list packages)
+ void setPackages (const PkgList &packages)
{
if (packages.empty()) {
gtk_widget_hide (m_widget);
@@ -1336,11 +1573,7 @@
{
// GTK+ doesn't fire selection change when a selected row changes, so we need
// to re-load PackageControl in that occasions.
- std::list ::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())
+ if (m_control->m_packages.contains (package))
m_control->setPackages (m_control->m_packages);
}
@@ -1564,7 +1797,7 @@
gtk_widget_show_all (m_box);
m_changes->setContainer (changes_box);
- m_details->setPackages (std::list ());
+ m_details->setPackages (PkgList());
}
~PackageSelector()
@@ -1581,7 +1814,7 @@
m_packages->setQuery (query);
}
- virtual void packagesSelected (const std::list &packages)
+ virtual void packagesSelected (const PkgList &packages)
{
m_details->setPackages (packages);
}
@@ -1607,9 +1840,6 @@
setBorder (0);
YGTK_WIZARD (getWidget())->child_border_width = 0;
- YGDialog *dialog = YGDialog::currentDialog();
- dialog->setCloseCallback (confirm_cb, this);
-
GtkWindow *window = YGDialog::currentWindow();
gtk_window_resize (window,
MAX (700, GTK_WIDGET (window)->allocation.width),
@@ -1620,7 +1850,6 @@
THEMEDIR "/icons/22x22/apps/yast-software.png");
ygtk_wizard_set_header_text (wizard, window,
onlineUpdateMode() ? _("Patch Selector") : _("Package Selector"));
- ygtk_wizard_set_help_text (wizard, onlineUpdateMode() ? patch_help : pkg_help);
ygtk_wizard_set_abort_button_label (wizard, _("_Cancel"));
ygtk_wizard_set_abort_button_str_id (wizard, "cancel");
@@ -1630,6 +1859,12 @@
g_signal_connect (G_OBJECT (getWidget()), "action-triggered",
G_CALLBACK (wizard_action_cb), this);
+ busyCursor();
+ ygtk_wizard_set_help_text (wizard, onlineUpdateMode() ? patch_help : pkg_help);
+
+ YGDialog *dialog = YGDialog::currentDialog();
+ dialog->setCloseCallback (confirm_cb, this);
+
m_package_selector = new PackageSelector (onlineUpdateMode());
gtk_container_add (GTK_CONTAINER (wizard), m_package_selector->getWidget());
Modified: trunk/gtk/src/YGUI.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUI.cc?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/YGUI.cc (original)
+++ trunk/gtk/src/YGUI.cc Sun Feb 3 02:23:04 2008
@@ -171,8 +171,7 @@
timeout = g_timeout_add (timeout_ms,
(GSourceFunc) user_input_timeout_cb, this);
- if (block)
- {
+ if (block) {
while (!pendingEvent())
g_main_context_iteration (NULL, TRUE);
}
@@ -303,10 +302,7 @@
YEvent *event = 0;
try {
- do
- {
- event = filterInvalidEvents( userInput(0) );
- } while ( ! event );
+ event = packageSelector->findDialog()->waitForEvent();
} 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!" );
@@ -314,8 +310,6 @@
y2error ("UI::RunPkgSelection() error (unspecified)");
y2error( "This is a libzypp problem. Do not file a bug against the UI!" );
}
-
- // y2milestone ("Package selection done - returning %s", input->toString().c_str());
return event;
}
Modified: trunk/gtk/src/YGUI.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGUI.h?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/YGUI.h (original)
+++ trunk/gtk/src/YGUI.h Sun Feb 3 02:23:04 2008
@@ -54,8 +54,9 @@
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();
+ // these two are now implemented at YDialog...
+ YEvent *userInput (unsigned long timeout_millisec);
+ YEvent *pollInput();
virtual void internalError (const char *msg);
Modified: trunk/gtk/src/yzyppwrapper.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/yzyppwrapper.cc?rev=44119&r1=44118&r2=44119&view=diff
==============================================================================
--- trunk/gtk/src/yzyppwrapper.cc (original)
+++ trunk/gtk/src/yzyppwrapper.cc Sun Feb 3 02:23:04 2008
@@ -1173,7 +1173,7 @@
bool Ypp::Impl::acceptLicense (Ypp::Package *package, const std::string &license)
{
if (interface)
- interface->acceptLicense (package, license);
+ return interface->acceptLicense (package, license);
return false;
}
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org