libyui-qt-pkg  2.45.6
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()->setSectionResizeMode( nameCol(), QHeaderView::Stretch );
120  header()->setSectionResizeMode( 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"
virtual FSize totalSize() const
The total size of this partition.
bool inRange() const
Check if the value is in range, i.e.
YQPkgWarningRangeNotifier overflowWarning
Warning range notifier about disk space overflow warning.
YQPkgDiskUsageListItem(YQPkgDiskUsageList *parent, const ZyppPartitionDu &partitionDu)
Constructor.
YQPkgDiskUsageList(QWidget *parent, int thresholdPercent=0)
Constructor.
void postPendingWarnings()
Post all pending disk space warnings based on the warning range notifiers.
void checkRemainingDiskSpace()
Check the remaining disk space of this partition based on percentage and absolute free MB...
virtual void keyPressEvent(QKeyEvent *ev)
Event handler for keyboard input - for debugging and testing.
void updateDiskUsage()
Update all statistical data in the list.
virtual QString name() const
The name to display for this partition ( the mount point ).
virtual FSize usedSize() const
The currently used size of this partition.
void enterProximity()
Notification that the proximity range is entered, i.e.
YQPkgWarningRangeNotifier()
Constructor.
bool needWarning() const
Check if a warning should be posted, i.e.
void clear()
Clear the current values, i.e.
virtual QSize sizeHint() const
Suggest reasonable default size.
YQPkgWarningRangeNotifier runningOutWarning
Warning range notifier about running out of disk space warning.
static bool diskUsageWarning(const QString &message, int thresholdPercent, const QString &acceptButtonLabel, const QString &rejectButtonLabel=QString::null)
Static convenience method: Post a disk usage warning with text &#39;message&#39;, a list of partitions that a...
void enterRange()
Notification that the inner range is entered.
void clearHistory()
Clear everything, including all history values such as if a warning has been posted.
bool leavingProximity() const
Check if the value is leaving the proximity range.
void warningPostedNotify()
Notification that a warning has been posted.
ZyppPartitionDu partitionDu() const
Returns the corresponding disk usage data.
List of disk usage of all attached partitions.
void updateDuData(const ZyppPartitionDu &fromData)
Update the disk usage data.