15 #include "ygtkpkgundolist.h"
22 std::list <YGtkPkgUndoList::Listener *> listeners;
25 { Ypp::addSelListener (
this); }
28 { Ypp::removeSelListener (
this); }
30 virtual void selectableModified()
34 for (
int i = 0; i < changes.size(); i++) {
37 _changes.append (sel);
43 for (
int step = 0; step < 2; step++) {
46 while (query.hasNext()) {
48 if ((step == 0 && sel.toModifyAuto()) || (step == 1 && !sel.toModifyAuto()))
50 if (changes.find (sel) == -1)
55 for (std::list <YGtkPkgUndoList::Listener *>::iterator it = listeners.begin();
56 it != listeners.end(); it++)
57 (*it)->undoChanged (parent);
61 YGtkPkgUndoList::YGtkPkgUndoList()
62 : impl (new
Impl (this)) {}
64 YGtkPkgUndoList::~YGtkPkgUndoList()
72 for (
int i = impl->changes.size()-1; i >= 0; i--) {
73 sel = &impl->changes.get (i);
74 if (sel->toModifyAuto()) {
75 if (autoCount) (*autoCount)++;
84 {
return impl->changes; }
86 void YGtkPkgUndoList::addListener (Listener *listener)
87 { impl->listeners.push_back (listener); }
89 void YGtkPkgUndoList::removeListener (Listener *listener)
90 { impl->listeners.remove (listener); }
92 #include "YGPackageSelector.h"
93 #include "ygtkpkglistview.h"
96 GtkWidget *vbox, *disk_label, *download_label, *warn_label;
98 GtkWidget *getWidget()
103 GtkWidget *hbox = gtk_hbox_new (FALSE, 6);
105 line = createSizeWidget (_(
"Disk space required:"), &disk_label);
106 gtk_box_pack_start (GTK_BOX (hbox), line, FALSE, TRUE, 0);
107 gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (
"/"), FALSE, TRUE, 0);
108 line = createSizeWidget (_(
"Download size:"), &download_label);
109 gtk_box_pack_start (GTK_BOX (hbox), line, FALSE, TRUE, 0);
110 gtk_widget_show_all (hbox);
112 warn_label = gtk_label_new (
"");
113 gtk_misc_set_alignment (GTK_MISC (warn_label), 0, .5);
114 gtk_label_set_selectable (GTK_LABEL (warn_label), TRUE);
116 vbox = gtk_vbox_new (FALSE, 6);
117 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
118 gtk_box_pack_start (GTK_BOX (vbox), warn_label, FALSE, TRUE, 0);
119 gtk_widget_show (vbox);
121 undoChanged (YGPackageSelector::get()->undoList());
122 YGPackageSelector::get()->undoList()->addListener (
this);
126 { YGPackageSelector::get()->undoList()->removeListener (
this); }
130 Size_t disk, download;
132 for (
int i = 0; i < list.size(); i++) {
134 if (sel.toInstall()) {
136 download += candidate.downloadSize();
137 if (sel.isInstalled())
138 disk += candidate.size() - sel.installed().size();
140 disk += candidate.size();
142 else if (sel.toRemove())
143 disk -= sel.installed().size();
146 gtk_label_set_text (GTK_LABEL (disk_label), disk.asString().c_str());
147 gtk_label_set_text (GTK_LABEL (download_label), download.asString().c_str());
149 gtk_widget_hide (warn_label);
150 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
151 for (ZyppDuSet::iterator it = diskUsage.begin(); it != diskUsage.end(); it++) {
152 const ZyppDu &point = *it;
153 if (!point.readonly && point.freeAfterCommit() < 0) {
155 char *over = g_strdup_printf (_(
"Partition %s is %s over-capacity"),
156 point.dir.c_str(), point.freeAfterCommit().asString().c_str());
158 char *fill = g_strdup_printf (_(
"%s filled out of %s"),
159 point.usedAfterCommit().asString().c_str(),
160 point.totalSize().asString().c_str());
161 char *markup = g_strdup_printf (
162 "<b><span color=\"red\">%s (%s)</span></b>", over, fill);
163 gtk_label_set_markup (GTK_LABEL (warn_label), markup);
164 g_free (over); g_free (fill); g_free (markup);
165 gtk_widget_show (warn_label);
171 static GtkWidget *createSizeWidget (
const char *label, GtkWidget **widget)
173 *widget = gtk_label_new (
"");
174 YGUtils::setWidgetFont (*widget, PANGO_STYLE_ITALIC,
175 PANGO_WEIGHT_NORMAL, PANGO_SCALE_MEDIUM);
176 gtk_misc_set_alignment (GTK_MISC (*widget), 1, .5);
177 gtk_label_set_selectable (GTK_LABEL (*widget), TRUE);
179 GtkWidget *title = gtk_label_new (label);
180 gtk_misc_set_alignment (GTK_MISC (title), 0, .5);
182 GtkWidget *hbox = gtk_hbox_new (FALSE, 6);
183 gtk_box_pack_start (GTK_BOX (hbox), title, FALSE, TRUE, 0);
184 gtk_box_pack_start (GTK_BOX (hbox), *widget, TRUE, TRUE, 0);
189 #define YAST_SYSCONFIG "/etc/sysconfig/yast2"
190 #include <zypp/base/Sysconfig.h>
192 enum { CLOSE_MODE, RESTART_MODE, SUMMARY_MODE };
194 static int read_PKGMGR_ACTION_AT_EXIT()
196 std::map <std::string, std::string> sysconfig =
197 zypp::base::sysconfig::read (YAST_SYSCONFIG);
198 std::map <std::string, std::string>::const_iterator it =
199 sysconfig.find(
"PKGMGR_ACTION_AT_EXIT");
200 if (it != sysconfig.end()) {
201 yuiMilestone() <<
"Read sysconfig's action at pkg mgr exit value: " << it->second << std::endl;
202 std::string mode (it->second);
203 if (mode ==
"restart")
205 else if (mode ==
"summary")
210 yuiMilestone() <<
"Could not read PKGMGR_ACTION_AT_EXIT variable from sysconfig" << std::endl;
214 static void write_PKGMGR_ACTION_AT_EXIT (
int mode)
219 case CLOSE_MODE: _mode =
"close";
break;
220 case RESTART_MODE: _mode =
"restart";
break;
221 case SUMMARY_MODE: _mode =
"summary";
break;
224 std::string cmd =
"sed -i 's/^[ \t]*PKGMGR_ACTION_AT_EXIT.*$/PKGMGR_ACTION_AT_EXIT=\"" +
225 _mode +
"\"/' " + YAST_SYSCONFIG;
226 ret = system(cmd.c_str());
227 yuiMilestone() <<
"Executing system cmd " << cmd <<
" returned " << ret << std::endl;
230 static void close_when_done_toggled_cb (GtkToggleButton *button)
232 gtk_toggle_button_set_inconsistent (button, FALSE);
233 int mode = gtk_toggle_button_get_active (button) ? CLOSE_MODE : RESTART_MODE;
234 write_PKGMGR_ACTION_AT_EXIT (mode);
237 static GtkWidget *create_close_when_done_check()
239 GtkWidget *check_box = gtk_check_button_new_with_label (_(
"Close software manager when done"));
240 int mode = read_PKGMGR_ACTION_AT_EXIT();
241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_box), mode == CLOSE_MODE);
242 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (check_box), mode == SUMMARY_MODE);
243 if (access (YAST_SYSCONFIG, W_OK) != 0) {
244 gtk_widget_set_sensitive (check_box, FALSE);
245 gtk_widget_set_tooltip_text (check_box,
"Cannot write to " YAST_SYSCONFIG);
247 g_signal_connect_after (G_OBJECT (check_box),
"toggled",
248 G_CALLBACK (close_when_done_toggled_cb), NULL);
249 gtk_widget_show (check_box);
258 addImageColumn (NULL, STATUS_ICON_PROP,
true);
259 addTextColumn (_(
"Name"), ACTION_NAME_PROP,
true, -1);
260 addTextColumn (_(
"Version"), SINGLE_VERSION_PROP,
true, 125);
261 addButtonColumn (_(
"Revert?"), UNDO_BUTTON_PROP);
263 undoChanged (YGPackageSelector::get()->undoList());
264 YGPackageSelector::get()->undoList()->addListener (
this);
268 { YGPackageSelector::get()->undoList()->removeListener (
this); }
271 { setList (undo->getList()); }
274 #include "ygtkpkghistorydialog.h"
276 bool YGtkPkgUndoList::popupDialog (
bool onApply)
278 GtkMessageType type = onApply ? GTK_MESSAGE_QUESTION : GTK_MESSAGE_OTHER;
279 GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
280 GtkDialogFlags (0), type, GTK_BUTTONS_NONE, _(
"Summary of changes"));
281 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
282 _(
"Review the changes to perform."));
284 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
285 GTK_STOCK_APPLY, GTK_RESPONSE_YES, NULL);
287 GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_UNDO, GTK_ICON_SIZE_DIALOG);
288 gtk_widget_show (image);
289 gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
290 gtk_dialog_add_buttons (GTK_DIALOG (dialog), _(
"See History"), 1,
291 GTK_STOCK_CLOSE, GTK_RESPONSE_YES, NULL);
294 GtkWidget *hbox = gtk_widget_get_parent (image);
295 gtk_box_set_child_packing (GTK_BOX (hbox), image, FALSE, TRUE, 0, GTK_PACK_START);
297 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
298 gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
299 gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 500);
304 GtkWidget *vbox = gtk_vbox_new (FALSE, 6);
305 gtk_box_pack_start (GTK_BOX (vbox), view.getWidget(), TRUE, TRUE, 0);
306 gtk_box_pack_start (GTK_BOX (vbox), change_size.getWidget(), FALSE, TRUE, 0);
308 gtk_box_pack_start (GTK_BOX (vbox), create_close_when_done_check(), FALSE, TRUE, 0);
309 gtk_widget_show (vbox);
310 gtk_widget_set_vexpand (vbox, TRUE);
311 GtkContainer *content = GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog)));
312 gtk_container_add (content, vbox);
314 int ret = gtk_dialog_run (GTK_DIALOG (dialog));
316 YGPackageSelector::get()->showHistoryDialog();
317 gtk_widget_destroy (dialog);
318 return ret == GTK_RESPONSE_YES;