libyui-qt-pkg  2.42.5
 All Classes Functions Variables Enumerations
YQPkgDiskUsageList.cc
1 /**************************************************************************
2 Copyright (C) 2000 - 2010 Novell, Inc.
3 All Rights Reserved.
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 
19 **************************************************************************/
20 
21 
22 /*---------------------------------------------------------------------\
23 | |
24 | __ __ ____ _____ ____ |
25 | \ \ / /_ _/ ___|_ _|___ \ |
26 | \ V / _` \___ \ | | __) | |
27 | | | (_| |___) || | / __/ |
28 | |_|\__,_|____/ |_| |_____| |
29 | |
30 | core system |
31 | (C) SuSE GmbH |
32 \----------------------------------------------------------------------/
33 
34  File: YQPkgDiskUsageList.cc
35 
36  Author: Stefan Hundhammer <sh@suse.de>
37 
38  Textdomain "qt-pkg"
39 
40 /-*/
41 
42 #define YUILogComponent "qt-pkg"
43 #include "YUILog.h"
44 
45 #include <QStyle>
46 #include <QHeaderView>
47 #include <QEvent>
48 
49 #include <zypp/ZYppFactory.h>
50 
51 #include "utf8.h"
52 #include "YQPkgDiskUsageList.h"
53 #include "YQPkgDiskUsageWarningDialog.h"
54 #include "YQi18n.h"
55 
56 
57 using std::set;
58 using std::endl;
59 
60 
61 // Warning ranges for "disk space is running out" or "disk space overflow".
62 // The WARN value triggers a warning popup once ( ! ). The warning will not be
63 // displayed again until the value sinks below the PROXIMITY value and then
64 // increases again to the WARN value.
65 //
66 // See class YQPkgWarningRangeNotifier in file YQPkgDiskUsageList.h for details.
67 
68 #define MIN_FREE_MB_WARN 400
69 #define MIN_FREE_MB_PROXIMITY 700
70 
71 #define MIN_PERCENT_WARN 90
72 #define MIN_PERCENT_PROXIMITY 80
73 
74 #define OVERFLOW_MB_WARN 0
75 #define OVERFLOW_MB_PROXIMITY 300
76 
77 
78 typedef zypp::DiskUsageCounter::MountPointSet ZyppDuSet;
79 typedef zypp::DiskUsageCounter::MountPointSet::iterator ZyppDuSetIterator;
80 
81 
82 
83 YQPkgDiskUsageList::YQPkgDiskUsageList( QWidget * parent, int thresholdPercent )
84  : QY2DiskUsageList( parent, true )
85 {
86  _debug = false;
87 
88  ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
89 
90  if ( diskUsage.empty() )
91  {
92  zypp::getZYpp()->setPartitions( zypp::DiskUsageCounter::detectMountPoints() );
93  diskUsage = zypp::getZYpp()->diskUsage();
94  }
95 
96 
97  for ( ZyppDuSetIterator it = diskUsage.begin();
98  it != diskUsage.end();
99  ++it )
100  {
101  const ZyppPartitionDu & partitionDu = *it;
102 
103  if ( ! partitionDu.readonly )
104  {
105  YQPkgDiskUsageListItem * item = new YQPkgDiskUsageListItem( this, partitionDu );
106  Q_CHECK_PTR( item );
107  item->updateData();
108  _items.insert( QString::fromUtf8(partitionDu.dir.c_str()), item );
109  }
110  }
111 
112  resizeColumnToContents( nameCol() );
113  resizeColumnToContents( totalSizeCol() );
114  //resizeColumnToContents( usedSizeCol() );
115  resizeColumnToContents( freeSizeCol() );
116 
117  sortByColumn( percentageBarCol(), Qt::DescendingOrder );
118 
119  header()->setResizeMode( nameCol(), QHeaderView::Stretch );
120  header()->setResizeMode( QHeaderView::Interactive );
121 }
122 
123 
124 void
126 {
129 
130  ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
131 
132  for ( ZyppDuSetIterator it = diskUsage.begin();
133  it != diskUsage.end();
134  ++it )
135  {
136  const ZyppPartitionDu & partitionDu = *it;
137  YQPkgDiskUsageListItem * item = _items[ QString::fromUtf8(partitionDu.dir.c_str()) ];
138 
139  if ( item )
140  item->updateDuData( partitionDu );
141  else
142  yuiError() << "No entry for mount point " << partitionDu.dir << endl;
143  }
144 
145  resizeColumnToContents( totalSizeCol() );
147 }
148 
149 
150 void
152 {
154  {
155  YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Error:</b> Out of disk space!" ),
156  100, _( "&OK" ) );
157 
159  runningOutWarning.warningPostedNotify(); // Suppress this ( now redundant ) other warning
160  }
161 
163  {
164  YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Warning:</b> Disk space is running out!" ) ,
165  MIN_PERCENT_WARN, _( "&OK" ) );
167  }
168 
171 
174 }
175 
176 
177 QSize
179 {
180  QFontMetrics fms( font() );
181  return QSize( fms.width( "/var/usr/home 100% 100.32GB 100.3GB" ) + 50, 100 );
182 
183 #ifdef FIXME
184  int width = header()->headerWidth()
185  + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
186 #else
187  int width = header()->sizeHint().width()
188  + 30;
189 #endif
190 
191  return QSize( width, 100 );
192 }
193 
194 
195 void
197 {
198 
199  if ( event )
200  {
201  Qt::KeyboardModifiers special_combo = ( Qt::ControlModifier| Qt::ShiftModifier | Qt::AltModifier );
202 
203  if ( ( event->modifiers() & special_combo ) == special_combo )
204  {
205  if ( event->key() == Qt::Key_Q )
206  {
207  _debug = ! _debug;
208  yuiMilestone() << "Debug mode: " << _debug << endl;
209  }
210 
211  }
212 
213  if ( _debug && currentItem() )
214  {
215  YQPkgDiskUsageListItem * item = dynamic_cast<YQPkgDiskUsageListItem *> ( currentItem() );
216 
217  if ( item )
218  {
219  {
220  int percent = item->usedPercent();
221 
222  switch ( event->key() )
223  {
224  case Qt::Key_1: percent = 10; break;
225  case Qt::Key_2: percent = 20; break;
226  case Qt::Key_3: percent = 30; break;
227  case Qt::Key_4: percent = 40; break;
228  case Qt::Key_5: percent = 50; break;
229  case Qt::Key_6: percent = 60; break;
230  case Qt::Key_7: percent = 70; break;
231  case Qt::Key_8: percent = 80; break;
232  case Qt::Key_9: percent = 90; break;
233  case Qt::Key_0: percent = 100; break;
234  case Qt::Key_Plus: percent += 3; break;
235  case Qt::Key_Minus: percent -= 3; break;
236 
237  case 'w':
238  // Only for testing, thus intentionally using no translations
239  YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Warning:</b> Disk space is running out!",
240  90, "&OK" );
241  break;
242 
243  case 'f':
244  YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Error:</b> Out of disk space!",
245  100, "&Continue anyway", "&Cancel" );
246  break;
247  }
248 
249  if ( percent < 0 )
250  percent = 0;
251 
252  ZyppPartitionDu partitionDu( item->partitionDu() );
253 
254  if ( percent != item->usedPercent() )
255  {
256  partitionDu.pkg_size = partitionDu.total_size * percent / 100;
257 
260 
261  item->updateDuData( partitionDu );
263  }
264  }
265  }
266  }
267  }
268 
269  QY2DiskUsageList::keyPressEvent( event );
270 }
271 
272 
273 
274 
275 
276 
278  const ZyppPartitionDu & partitionDu )
279  : QY2DiskUsageListItem( parent )
280  , _partitionDu( partitionDu )
281  , _pkgDiskUsageList( parent )
282 {
283  yuiDebug() << "disk usage list entry for " << partitionDu.dir << endl;
284 }
285 
286 
287 FSize
289 {
290  return FSize( _partitionDu.pkg_size, FSize::K );
291 }
292 
293 
294 FSize
296 {
297  return FSize( _partitionDu.total_size, FSize::K );
298 }
299 
300 
301 QString
303 {
304  return fromUTF8( _partitionDu.dir.c_str() );
305 }
306 
307 
308 void
309 YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData )
310 {
311  _partitionDu = fromData;
312  updateData();
314 }
315 
316 
317 void
319 {
320  int percent = usedPercent();
321  int free = freeSize() / FSize::MB;
322 
323  if ( percent > MIN_PERCENT_WARN )
324  {
325  // Modern hard disks can be huge, so a warning based on percentage only
326  // can be misleading - check the absolute value, too.
327 
328  if ( free < MIN_FREE_MB_PROXIMITY )
329  _pkgDiskUsageList->runningOutWarning.enterProximity();
330 
331  if ( free < MIN_FREE_MB_WARN )
332  _pkgDiskUsageList->runningOutWarning.enterRange();
333  }
334 
335  if ( free < MIN_FREE_MB_PROXIMITY )
336  {
337  if ( percent > MIN_PERCENT_PROXIMITY )
338  _pkgDiskUsageList->runningOutWarning.enterProximity();
339  }
340 
341  if ( free < OVERFLOW_MB_WARN )
342  _pkgDiskUsageList->overflowWarning.enterRange();
343 
344  if ( free < OVERFLOW_MB_PROXIMITY )
345  _pkgDiskUsageList->overflowWarning.enterProximity();
346 }
347 
348 
349 
350 
351 
352 
354 {
355  clearHistory();
356 }
357 
358 
359 void
361 {
362  _inRange = false;
363  _hasBeenClose = _isClose;
364  _isClose = false;
365 }
366 
367 
368 void
370 {
371  clear();
372  _hasBeenClose = false;
373  _warningPosted = false;
374 }
375 
376 
377 void
379 {
380  _inRange = true;
381  enterProximity();
382 }
383 
384 
385 void
387 {
388  _isClose = true;
389  _hasBeenClose = true;
390 }
391 
392 
393 void
395 {
396  _warningPosted = true;
397 }
398 
399 
400 bool
402 {
403  return _inRange;
404 }
405 
406 
407 bool
409 {
410  return ! _isClose && ! _hasBeenClose;
411 }
412 
413 
414 bool
416 {
417  return _inRange && ! _warningPosted;
418 }
419 
420 
421 
422 
423 #include "YQPkgDiskUsageList.moc"