1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
13 File: YQPkgDiskUsageList.cc
15 Author: Stefan Hundhammer <sh@suse.de>
17 Textdomain "packages-qt"
22 #define y2log_component "qt-pkg"
23 #include <ycp/y2log.h>
30 #include <zypp/ZYppFactory.h>
33 #include "YQPkgDiskUsageList.h"
34 #include "YQPkgDiskUsageWarningDialog.h"
41 // Warning ranges for "disk space is running out" or "disk space overflow".
42 // The WARN value triggers a warning popup once ( ! ). The warning will not be
43 // displayed again until the value sinks below the PROXIMITY value and then
44 // increases again to the WARN value.
46 // See class YQPkgWarningRangeNotifier in file YQPkgDiskUsageList.h for details.
48 #define MIN_FREE_MB_WARN 400
49 #define MIN_FREE_MB_PROXIMITY 700
51 #define MIN_PERCENT_WARN 90
52 #define MIN_PERCENT_PROXIMITY 80
54 #define OVERFLOW_MB_WARN 0
55 #define OVERFLOW_MB_PROXIMITY 300
58 typedef zypp::DiskUsageCounter::MountPointSet ZyppDuSet;
59 typedef zypp::DiskUsageCounter::MountPointSet::iterator ZyppDuSetIterator;
63 YQPkgDiskUsageList::YQPkgDiskUsageList( QWidget * parent, int thresholdPercent )
64 : QY2DiskUsageList( parent, true )
68 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
70 if ( diskUsage.empty() )
72 zypp::getZYpp()->setPartitions( zypp::DiskUsageCounter::detectMountPoints() );
73 diskUsage = zypp::getZYpp()->diskUsage();
77 for ( ZyppDuSetIterator it = diskUsage.begin();
78 it != diskUsage.end();
81 const ZyppPartitionDu & partitionDu = *it;
83 if ( ! partitionDu.readonly )
85 YQPkgDiskUsageListItem * item = new YQPkgDiskUsageListItem( this, partitionDu );
88 _items.insert( partitionDu.dir.c_str(), item );
96 YQPkgDiskUsageList::updateDiskUsage()
98 runningOutWarning.clear();
99 overflowWarning.clear();
101 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
103 for ( ZyppDuSetIterator it = diskUsage.begin();
104 it != diskUsage.end();
107 const ZyppPartitionDu & partitionDu = *it;
108 YQPkgDiskUsageListItem * item = _items[ partitionDu.dir.c_str() ];
111 item->updateDuData( partitionDu );
113 y2error( "No entry for mount point %s", partitionDu.dir.c_str() );
117 postPendingWarnings();
122 YQPkgDiskUsageList::postPendingWarnings()
124 if ( overflowWarning.needWarning() )
126 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Error:</b> Out of disk space!" ),
129 overflowWarning.warningPostedNotify();
130 runningOutWarning.warningPostedNotify(); // Suppress this ( now redundant ) other warning
133 if ( runningOutWarning.needWarning() )
135 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Warning:</b> Disk space is running out!" ) ,
136 MIN_PERCENT_WARN, _( "&OK" ) );
137 runningOutWarning.warningPostedNotify();
140 if ( overflowWarning.leavingProximity() )
141 overflowWarning.clearHistory();
143 if ( runningOutWarning.leavingProximity() )
144 runningOutWarning.clearHistory();
149 YQPkgDiskUsageList::sizeHint() const
151 int width = header()->headerWidth()
153 + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
158 return QSize( width, 100 );
163 YQPkgDiskUsageList::keyPressEvent( QKeyEvent * event )
168 unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton );
170 if ( ( event->state() & special_combo ) == special_combo )
172 if ( event->key() == Qt::Key_Q )
175 y2milestone( "Debug mode %s", _debug ? "on" : "off" );
180 if ( _debug && currentItem() )
182 YQPkgDiskUsageListItem * item = dynamic_cast<YQPkgDiskUsageListItem *> ( currentItem() );
187 int percent = item->usedPercent();
189 switch ( event->ascii() )
191 case '1': percent = 10; break;
192 case '2': percent = 20; break;
193 case '3': percent = 30; break;
194 case '4': percent = 40; break;
195 case '5': percent = 50; break;
196 case '6': percent = 60; break;
197 case '7': percent = 70; break;
198 case '8': percent = 80; break;
199 case '9': percent = 90; break;
200 case '0': percent = 100; break;
201 case '+': percent += 3; break;
202 case '-': percent -= 3; break;
205 // Only for testing, thus intentionally using no translations
206 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Warning:</b> Disk space is running out!",
211 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Error:</b> Out of disk space!",
212 100, "&Continue anyway", "&Cancel" );
219 ZyppPartitionDu partitionDu( item->partitionDu() );
221 if ( percent != item->usedPercent() )
223 partitionDu.pkg_size = partitionDu.total_size * percent / 100;
225 runningOutWarning.clear();
226 overflowWarning.clear();
228 item->updateDuData( partitionDu );
229 postPendingWarnings();
236 QY2DiskUsageList::keyPressEvent( event );
244 YQPkgDiskUsageListItem::YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent,
245 const ZyppPartitionDu & partitionDu )
246 : QY2DiskUsageListItem( parent )
247 , _partitionDu( partitionDu )
248 , _pkgDiskUsageList( parent )
250 y2debug( "disk usage list entry for %s", partitionDu.dir.c_str() );
255 YQPkgDiskUsageListItem::usedSize() const
257 return FSize( _partitionDu.pkg_size, FSize::K );
262 YQPkgDiskUsageListItem::totalSize() const
264 return FSize( _partitionDu.total_size, FSize::K );
269 YQPkgDiskUsageListItem::name() const
271 return fromUTF8( _partitionDu.dir.c_str() );
276 YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData )
278 _partitionDu = fromData;
280 checkRemainingDiskSpace();
285 YQPkgDiskUsageListItem::checkRemainingDiskSpace()
287 int percent = usedPercent();
288 int free = freeSize() / FSize::MB;
290 if ( percent > MIN_PERCENT_WARN )
292 // Modern hard disks can be huge, so a warning based on percentage only
293 // can be misleading - check the absolute value, too.
295 if ( free < MIN_FREE_MB_PROXIMITY )
296 _pkgDiskUsageList->runningOutWarning.enterProximity();
298 if ( free < MIN_FREE_MB_WARN )
299 _pkgDiskUsageList->runningOutWarning.enterRange();
302 if ( free < MIN_FREE_MB_PROXIMITY )
304 if ( percent > MIN_PERCENT_PROXIMITY )
305 _pkgDiskUsageList->runningOutWarning.enterProximity();
308 if ( free < OVERFLOW_MB_WARN )
309 _pkgDiskUsageList->overflowWarning.enterRange();
311 if ( free < OVERFLOW_MB_PROXIMITY )
312 _pkgDiskUsageList->overflowWarning.enterProximity();
320 YQPkgWarningRangeNotifier::YQPkgWarningRangeNotifier()
327 YQPkgWarningRangeNotifier::clear()
330 _hasBeenClose = _isClose;
336 YQPkgWarningRangeNotifier::clearHistory()
339 _hasBeenClose = false;
340 _warningPosted = false;
345 YQPkgWarningRangeNotifier::enterRange()
353 YQPkgWarningRangeNotifier::enterProximity()
356 _hasBeenClose = true;
361 YQPkgWarningRangeNotifier::warningPostedNotify()
363 _warningPosted = true;
368 YQPkgWarningRangeNotifier::inRange() const
375 YQPkgWarningRangeNotifier::leavingProximity() const
377 return ! _isClose && ! _hasBeenClose;
382 YQPkgWarningRangeNotifier::needWarning() const
384 return _inRange && ! _warningPosted;
390 #include "YQPkgDiskUsageList.moc"