Author: rpmcruz
Date: Mon Dec 6 19:20:17 2010
New Revision: 62956
URL: http://svn.opensuse.org/viewcvs/yast?rev=62956&view=rev
Log:
* src/ygtkpkgvestigialdialog.h/cc: now functional.
* src/YGText.cc: reduced flickering of LogView,
and allowed user to freely scroll it.
Modified:
trunk/gtk/ChangeLog
trunk/gtk/src/YGText.cc
trunk/gtk/src/pkg/ygtkpkghistorydialog.cc
trunk/gtk/src/pkg/ygtkpkglanguageview.cc
trunk/gtk/src/pkg/ygtkpkgsearchentry.cc
trunk/gtk/src/pkg/ygtkpkgvestigialdialog.cc
trunk/gtk/src/pkg/ygtkpkgvestigialdialog.h
Modified: trunk/gtk/ChangeLog
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/ChangeLog?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/ChangeLog (original)
+++ trunk/gtk/ChangeLog Mon Dec 6 19:20:17 2010
@@ -1,5 +1,12 @@
2010-12-05 Ricardo Cruz
+ * src/ygtkpkgvestigialdialog.h/cc: now functional.
+
+ * src/YGText.cc: reduced flickering of LogView,
+ and allowed user to freely scroll it.
+
+2010-12-05 Ricardo Cruz
+
* src/ygtkpkgvestigialdialog.h/cc: show unneeded
packages (not done yet), as requested by Atri.
Modified: trunk/gtk/src/YGText.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGText.cc?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/YGText.cc (original)
+++ trunk/gtk/src/YGText.cc Mon Dec 6 19:20:17 2010
@@ -47,12 +47,19 @@
gtk_text_buffer_delete (getBuffer(), &start_it, &end_it);
}
- void setText (const string &text)
+ void setText (const std::string &text)
{
BlockEvents block (this);
gtk_text_buffer_set_text (getBuffer(), text.c_str(), -1);
}
+ void appendText (const std::string &text)
+ {
+ GtkTextIter end_it;
+ gtk_text_buffer_get_end_iter (getBuffer(), &end_it);
+ gtk_text_buffer_insert (getBuffer(), &end_it, text.c_str(), -1);
+ }
+
std::string getText()
{
GtkTextIter start_it, end_it;
@@ -66,8 +73,9 @@
void scrollToBottom()
{
- //YGUtils::scrollWidget (GTK_TEXT_VIEW (getWidget())->vadjustment, false);
-
+#if 1
+ YGUtils::scrollWidget (GTK_TEXT_VIEW (getWidget())->vadjustment, false);
+#else
GtkTextBuffer *buffer = getBuffer();
GtkTextIter iter;
gtk_text_buffer_get_end_iter (buffer, &iter);
@@ -81,6 +89,7 @@
GtkTextView *view = GTK_TEXT_VIEW (getWidget());
gtk_text_view_scroll_mark_onscreen (view, mark);
+#endif
}
// Event callbacks
@@ -140,28 +149,38 @@
class YGLogView : public YLogView, public YGTextView
{
-bool m_cancelAutoScroll;
+std::string m_text;
public:
YGLogView (YWidget *parent, const string &label, int visibleLines, int maxLines)
: YLogView (NULL, label, visibleLines, maxLines)
- , YGTextView (this, parent, label, false), m_cancelAutoScroll (false)
- {
- GtkAdjustment *adj = GTK_TEXT_VIEW (getWidget())->vadjustment;
- g_signal_connect (G_OBJECT (adj), "value-changed",
- G_CALLBACK (adj_value_changed_cb), this);
- }
+ , YGTextView (this, parent, label, false)
+ {}
// YLogView
- virtual void displayLogText (const string &text)
+ virtual void displayLogText (const std::string &text)
{
- setText (text);
- if (!m_cancelAutoScroll) {
- GtkAdjustment *adj = GTK_TEXT_VIEW (getWidget())->vadjustment;
- g_signal_handlers_block_by_func (adj, (gpointer) adj_value_changed_cb, this);
- scrollToBottom();
- g_signal_handlers_unblock_by_func (adj, (gpointer) adj_value_changed_cb, this);
+ // libyui calls clearText before setting it: let's ignore it
+ if (text.empty()) return;
+
+ if (text.compare (0, m_text.size(), m_text) == 0) {
+ if (text.size() == m_text.size()) return;
+
+ // appending text: avoid flickering and allow user to scroll freely
+ GtkAdjustment *vadj = GTK_TEXT_VIEW (getWidget())->vadjustment;
+ bool autoScroll = vadj->value >= vadj->upper - vadj->page_size;
+
+ std::string diff (text.substr (m_text.size()));
+ YGTextView::appendText (diff);
+ if (autoScroll)
+ YGTextView::scrollToBottom();
+
+ }
+ else {
+ YGTextView::setText (text);
+ YGTextView::scrollToBottom();
}
+ m_text = text;
}
// YGWidget
@@ -174,12 +193,6 @@
return 50;
}
- static void adj_value_changed_cb (GtkAdjustment *vadj, YGLogView *pThis)
- {
- // user scrolling - disable auto-scroll if user wants to look up
- pThis->m_cancelAutoScroll = (vadj->value < vadj->upper - vadj->page_size);
- }
-
YGLABEL_WIDGET_IMPL (YLogView)
};
Modified: trunk/gtk/src/pkg/ygtkpkghistorydialog.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/pkg/ygtkpkghistorydialog.cc?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/pkg/ygtkpkghistorydialog.cc (original)
+++ trunk/gtk/src/pkg/ygtkpkghistorydialog.cc Mon Dec 6 19:20:17 2010
@@ -485,6 +485,29 @@
ygtk_tree_view_popup_menu (view, menu);
}
+static gboolean read_logs_idle_cb (void *data)
+{
+ GtkWidget **views = (GtkWidget **) data;
+ GtkWidget *dialog = views[0];
+ GtkTreeView *log_view = GTK_TREE_VIEW (views[1]);
+ GtkTreeView *date_view = GTK_TREE_VIEW (views[2]);
+
+ ListHandler handler;
+ ZyppHistoryParser parser (&handler);
+
+ gtk_tree_view_set_model (date_view, handler.date_handler->getModel());
+ gtk_tree_view_set_model (log_view, handler.log_handler->getModel());
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (date_view);
+ GtkTreeIter iter;
+ if (gtk_tree_model_get_iter_first (
+ gtk_tree_view_get_model (date_view), &iter))
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ gdk_window_set_cursor (dialog->window, NULL);
+ return FALSE;
+}
+
YGtkPkgHistoryDialog::YGtkPkgHistoryDialog()
{
GtkCellRenderer *renderer, *pix_renderer;
@@ -597,7 +620,7 @@
GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_OTHER, GTK_BUTTONS_NONE,
- _("History (%s)"), FILENAME);
+ _("Show History (%s)"), FILENAME);
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_JUMP_TO, 1);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Save to File"), 2);
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
@@ -630,24 +653,13 @@
g_signal_connect (G_OBJECT (selection), "changed",
G_CALLBACK (date_selection_changed_cb), log_view);
- GdkDisplay *display = gtk_widget_get_display (dialog);
- GdkCursor *cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
- gdk_window_set_cursor (gtk_widget_get_window (dialog), cursor);
- while (g_main_context_iteration (NULL, FALSE)) ;
+ GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
+ gdk_window_set_cursor (dialog->window, cursor);
gdk_cursor_unref (cursor);
- ListHandler handler;
- ZyppHistoryParser parser (&handler);
- gtk_tree_view_set_model (GTK_TREE_VIEW (date_view), handler.date_handler->getModel());
- gtk_tree_view_set_model (GTK_TREE_VIEW (log_view), handler.log_handler->getModel());
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (date_view));
- GtkTreeIter iter;
- if (gtk_tree_model_get_iter_first (
- gtk_tree_view_get_model (GTK_TREE_VIEW (date_view)), &iter))
- gtk_tree_selection_select_iter (selection, &iter);
-
- gdk_window_set_cursor (dialog->window, NULL);
+ GtkWidget **views = g_new (GtkWidget *, 3);
+ views[0] = dialog; views[1] = log_view; views[2] = date_view;
+ g_idle_add_full (G_PRIORITY_LOW, read_logs_idle_cb, views, g_free);
}
YGtkPkgHistoryDialog::~YGtkPkgHistoryDialog()
Modified: trunk/gtk/src/pkg/ygtkpkglanguageview.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/pkg/ygtkpkglanguageview.cc?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/pkg/ygtkpkglanguageview.cc (original)
+++ trunk/gtk/src/pkg/ygtkpkglanguageview.cc Mon Dec 6 19:20:17 2010
@@ -17,8 +17,7 @@
addTextColumn (NULL, NAME_SUMMARY_PROP, true, -1);
Ypp::LangQuery query;
- Ypp::List list (query);
- YGtkPkgListView::setList (list);
+ YGtkPkgListView::setList (query);
YGtkPkgListView::setListener (this);
}
@@ -28,7 +27,7 @@
bool YGtkPkgLanguageView::writeQuery (Ypp::PoolQuery &query)
{
- Ypp::List list = getSelected();
+ Ypp::List list (getSelected());
if (list.size() > 0) {
Ypp::Collection col (list.get (0));
query.addCriteria (new Ypp::FromCollectionMatch (col));
Modified: trunk/gtk/src/pkg/ygtkpkgsearchentry.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/pkg/ygtkpkgsearchentry.cc?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/pkg/ygtkpkgsearchentry.cc (original)
+++ trunk/gtk/src/pkg/ygtkpkgsearchentry.cc Mon Dec 6 19:20:17 2010
@@ -79,7 +79,7 @@
: YGtkPkgQueryWidget(), impl (new Impl())
{
impl->entry = gtk_entry_new();
- gtk_widget_set_size_request (impl->entry, 160, -1);
+ gtk_widget_set_size_request (impl->entry, 180, -1);
g_signal_connect (G_OBJECT (impl->entry), "realize", // grab focus at start
G_CALLBACK (gtk_widget_grab_focus), NULL);
g_signal_connect (G_OBJECT (impl->entry), "changed",
Modified: trunk/gtk/src/pkg/ygtkpkgvestigialdialog.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/pkg/ygtkpkgvestigialdialog.cc?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/pkg/ygtkpkgvestigialdialog.cc (original)
+++ trunk/gtk/src/pkg/ygtkpkgvestigialdialog.cc Mon Dec 6 19:20:17 2010
@@ -12,21 +12,14 @@
#include "config.h"
#include "YGDialog.h"
#include "ygtkpkgvestigialdialog.h"
+#include "ygtkpkglistview.h"
+#include "YGPackageSelector.h"
#include "yzyppwrapper.h"
#include
#include
#define FILENAME "/var/log/zypp/history"
-static void response_cb (GtkDialog *dialog, gint response, YGtkPkgVestigialDialog *pThis)
-{
- switch (response) {
-/* case 1: goto_clicked (log_view); break;
- case 2: save_to_file (GTK_WINDOW (dialog)); break;*/
- default: gtk_widget_hide (GTK_WIDGET (dialog)); break;
- }
-}
-
struct ZyppVestigialParser
{
std::set std::string m_dependencies;
@@ -48,7 +41,6 @@
if (item->action.toEnum() == zypp::HistoryActionID::INSTALL_e) {
zypp::HistoryItemInstall *_item =
static_cast (item.get());
-fprintf (stderr, "pkg '%s'\n", _item->name.c_str());
const std::string &name (_item->name);
bool autoreq = _item->reqby.empty();
@@ -57,45 +49,95 @@
bool update = repoUrl.find ("update") != std::string::npos;
if (!update) { // updates are ambiguous
- fprintf (stderr, "\trepo: '%s' - autoreq: %d\n", _item->repoalias.c_str(), autoreq);
- std::set std::string::iterator it;
- it = m_dependencies.find (name);
- if (it != m_dependencies.end()) {
- if (autoreq)
- m_dependencies.insert (name);
- }
- else {
- if (!autoreq)
- m_dependencies.erase (it);
- }
+ if (autoreq)
+ m_dependencies.insert (name);
+ else
+ m_dependencies.erase (name);
}
}
-else
-fprintf (stderr, "action: '%d'\n", item->action);
return true;
}
};
+struct YGtkPkgVestigialDialog::Impl : public YGtkPkgListView::Listener
+{
+ GtkWidget *dialog;
+ YGtkPkgListView *view;
+ GtkWidget *progressbar;
+
+ virtual void selectionChanged()
+ {
+ Ypp::List selected (view->getSelected());
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), 1, selected.size());
+ }
+
+ void goto_clicked()
+ {
+ Ypp::List selected (view->getSelected());
+ if (selected.size()) {
+ std::string name (selected.get(0).name());
+ YGPackageSelector::get()->searchFor (Ypp::PoolQuery::NAME, name);
+ }
+ gtk_widget_hide (dialog);
+ }
+
+ void remove_all()
+ {
+ Ypp::List selected (view->getSelected());
+ selected.remove();
+ }
+
+ static void response_cb (GtkDialog *dialog, gint response, Impl *pThis)
+ {
+ switch (response) {
+ case 1: pThis->goto_clicked(); break;
+ case 2: pThis->remove_all(); break;
+ default: gtk_widget_hide (GTK_WIDGET (pThis->dialog)); break;
+ }
+ }
+
+ void set_progress (gdouble fraction)
+ {
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progressbar), fraction);
+ while (g_main_context_iteration (NULL, FALSE)) ;
+ }
+};
+
static bool testIsNeededDependency (ZyppSelectable zsel)
{ // pass only installed packages: zsel->status() == S_KeepInstalled
- fprintf (stderr, "test is needed: %s\n", zsel->name().c_str());
zsel->setStatus (zypp::ui::S_Del);
zypp::Resolver_Ptr zResolver = zypp::getZYpp()->resolver();
bool noProbs = zResolver->resolvePool();
zResolver->undo();
zsel->setStatus (zypp::ui::S_KeepInstalled);
- fprintf (stderr, "\t%d\n", !noProbs);
return !noProbs;
}
-YGtkPkgVestigialDialog::YGtkPkgVestigialDialog()
-//: m_unneeded (Ypp::List (zyppPool().byKindBegin(zypp::ResKind::package).size()))
+static void filterWhenContains (Ypp::Collection &col, std::list <ZyppSelectable> &pkgs)
{
+ std::list <ZyppSelectable>::iterator it = pkgs.begin();
+ while (it != pkgs.end()) {
+ Ypp::Selectable p (*it);
+ if (col.contains (p))
+ it = pkgs.erase (it);
+ else it++;
+ }
+}
+
+static gboolean fill_list_idle_cb (void *data)
+{
+ YGtkPkgVestigialDialog::Impl *impl = (YGtkPkgVestigialDialog::Impl *) data;
+
+ // 1. get list of packages installed as dependencies
ZyppVestigialParser parser;
- fprintf (stderr, "done parsing\n");
- for (std::set std::string::const_iterator it = parser.m_dependencies.begin();
- it != parser.m_dependencies.end(); it++) {
+ const std::set std::string &deps = parser.m_dependencies;
+ impl->set_progress (.5);
+ // 2. map string names to zypp objects and check whether they are still necessary
+ int size = deps.size(), i = 0;
+ std::list <ZyppSelectable> unneeded;
+ for (std::set std::string::const_iterator it = deps.begin();
+ it != deps.end(); it++) {
Ypp::PoolQuery query (Ypp::Selectable::PACKAGE);
query.addStringOr (*it);
query.addStringAttribute (Ypp::PoolQuery::NAME);
@@ -105,51 +147,101 @@
ZyppSelectable zsel = sel.zyppSel();
if (zsel->status() == zypp::ui::S_KeepInstalled)
if (!testIsNeededDependency (zsel))
- fprintf (stderr, "** not needed: %s\n", zsel->name().c_str());
+ unneeded.push_back (zsel);
}
- }
-
-
-
- // for each log entry set as 'auto'
- // find pkg
- // remove pkg
- // run solver
- // if no problems:
- // add to unneeded list
- // cancel solver
-
-
+ if ((i % 10) == 0)
+ impl->set_progress (.5 + ((i / (gdouble) size) * .85));
+ i++;
+ }
+ // 3. filter those installed by a container
+ Ypp::LangQuery langQuery;
+ size = langQuery.guessSize(); i = 0;
+ while (langQuery.hasNext()) {
+ Ypp::Selectable sel (langQuery.next());
+ if (!sel.isInstalled()) continue;
+ Ypp::Collection col (sel);
+ filterWhenContains (col, unneeded);
+ }
+ impl->set_progress (.95);
+ Ypp::PoolQuery patternQuery (Ypp::Selectable::PATTERN);
+ patternQuery.addCriteria (new Ypp::StatusMatch (Ypp::StatusMatch::IS_INSTALLED));
+ size = patternQuery.guessSize(); i = 0;
+ while (patternQuery.hasNext()) {
+ Ypp::Selectable sel (patternQuery.next());
+ Ypp::Collection col (sel);
+ filterWhenContains (col, unneeded);
+ }
+ Ypp::List list (unneeded.size());
+ for (std::list <ZyppSelectable>::const_iterator it = unneeded.begin();
+ it != unneeded.end(); it++)
+ list.append (*it);
+ impl->view->setList (list);
+
+ gtk_widget_hide (impl->progressbar);
+ gdk_window_set_cursor (impl->dialog->window, NULL);
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (impl->dialog), 2, unneeded.size());
+ return FALSE;
+}
+YGtkPkgVestigialDialog::YGtkPkgVestigialDialog()
+{
GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_OTHER, GTK_BUTTONS_NONE,
_("Show Unneeded Dependencies"));
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- _("This is not a comprehensive listing of dependencies no longer in "
- "use. It is possible we missed some."));
+ _("This is a listing of dependencies no longer used. It is neither "
+ "accurate, nor comprehensive. Use with care."));
+
+ impl = new Impl();
+ GtkWidget *action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
+ impl->progressbar = gtk_progress_bar_new();
+ gtk_widget_set_size_request (impl->progressbar, -1, 0);
+ gtk_container_add (GTK_CONTAINER (action_area), impl->progressbar);
+
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_JUMP_TO, 1);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Remove All"), 2);
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), 1, FALSE);
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), 2, FALSE);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
gtk_window_set_default_size (GTK_WINDOW (dialog), 650, 600);
g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (response_cb), this);
+ G_CALLBACK (Impl::response_cb), impl);
g_signal_connect (G_OBJECT (dialog), "delete-event",
- G_CALLBACK (gtk_true), this);
+ G_CALLBACK (gtk_true), NULL);
+
+ impl->view = new YGtkPkgListView (true, Ypp::List::NAME_SORT, false, true);
+ impl->view->addCheckColumn (INSTALLED_CHECK_PROP);
+ impl->view->addTextColumn (_("Name"), NAME_SUMMARY_PROP, true, -1);
+ impl->view->addTextColumn (_("Version"), VERSION_PROP, true, 125);
+ impl->view->addTextColumn (_("Size"), SIZE_PROP, false, 85);
+ impl->view->addTextColumn (_("Repository"), REPOSITORY_PROP, false, 180);
+ impl->view->addTextColumn (_("Supportability"), SUPPORT_PROP, false, 120);
+ impl->view->setListener (impl);
- gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), gtk_label_new ("TO DO"));
+ GtkWidget *content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_container_add (GTK_CONTAINER (content), impl->view->getWidget());
gtk_widget_show_all (dialog);
- m_dialog = dialog;
+ impl->dialog = dialog;
+
+ GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
+ gdk_window_set_cursor (dialog->window, cursor);
+ gdk_cursor_unref (cursor);
+
+ g_idle_add_full (G_PRIORITY_LOW, fill_list_idle_cb, impl, NULL);
}
YGtkPkgVestigialDialog::~YGtkPkgVestigialDialog()
-{ gtk_widget_destroy (m_dialog); }
+{
+ delete impl->view;
+ gtk_widget_destroy (impl->dialog);
+ delete impl;
+}
void YGtkPkgVestigialDialog::popup()
-{ gtk_window_present (GTK_WINDOW (m_dialog)); }
+{ gtk_window_present (GTK_WINDOW (impl->dialog)); }
Modified: trunk/gtk/src/pkg/ygtkpkgvestigialdialog.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/pkg/ygtkpkgvestigialdialog.h?rev=62956&r1=62955&r2=62956&view=diff
==============================================================================
--- trunk/gtk/src/pkg/ygtkpkgvestigialdialog.h (original)
+++ trunk/gtk/src/pkg/ygtkpkgvestigialdialog.h Mon Dec 6 19:20:17 2010
@@ -17,9 +17,8 @@
void popup();
-private:
- GtkWidget *m_dialog;
-// Ypp::List m_unneeded;
+ struct Impl;
+ Impl *impl;
};
// you do not want to use this class directly:
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org