1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
13 File: YQPkgDiskUsageList.cc
15 Author: Stefan Hundhammer <sh@suse.de>
17 Textdomain "packages-qt"
21 #define y2log_component "qt-pkg"
22 #include <ycp/y2log.h>
26 #include <QHeaderView>
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() );
119 postPendingWarnings();
124 YQPkgDiskUsageList::postPendingWarnings()
126 if ( overflowWarning.needWarning() )
128 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Error:</b> Out of disk space!" ),
131 overflowWarning.warningPostedNotify();
132 runningOutWarning.warningPostedNotify(); // Suppress this ( now redundant ) other warning
135 if ( runningOutWarning.needWarning() )
137 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Warning:</b> Disk space is running out!" ) ,
138 MIN_PERCENT_WARN, _( "&OK" ) );
139 runningOutWarning.warningPostedNotify();
142 if ( overflowWarning.leavingProximity() )
143 overflowWarning.clearHistory();
145 if ( runningOutWarning.leavingProximity() )
146 runningOutWarning.clearHistory();
151 YQPkgDiskUsageList::sizeHint() const
155 int width = header()->headerWidth()
156 + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
158 int width = header()->sizeHint().width()
162 return QSize( width, 100 );
167 YQPkgDiskUsageList::keyPressEvent( QKeyEvent * event )
172 unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton );
174 if ( ( event->state() & special_combo ) == special_combo )
176 if ( event->key() == Qt::Key_Q )
179 y2milestone( "Debug mode %s", _debug ? "on" : "off" );
184 if ( _debug && currentItem() )
186 YQPkgDiskUsageListItem * item = dynamic_cast<YQPkgDiskUsageListItem *> ( currentItem() );
191 int percent = item->usedPercent();
193 switch ( event->ascii() )
195 case '1': percent = 10; break;
196 case '2': percent = 20; break;
197 case '3': percent = 30; break;
198 case '4': percent = 40; break;
199 case '5': percent = 50; break;
200 case '6': percent = 60; break;
201 case '7': percent = 70; break;
202 case '8': percent = 80; break;
203 case '9': percent = 90; break;
204 case '0': percent = 100; break;
205 case '+': percent += 3; break;
206 case '-': percent -= 3; break;
209 // Only for testing, thus intentionally using no translations
210 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Warning:</b> Disk space is running out!",
215 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Error:</b> Out of disk space!",
216 100, "&Continue anyway", "&Cancel" );
223 ZyppPartitionDu partitionDu( item->partitionDu() );
225 if ( percent != item->usedPercent() )
227 partitionDu.pkg_size = partitionDu.total_size * percent / 100;
229 runningOutWarning.clear();
230 overflowWarning.clear();
232 item->updateDuData( partitionDu );
233 postPendingWarnings();
240 QY2DiskUsageList::keyPressEvent( event );
248 YQPkgDiskUsageListItem::YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent,
249 const ZyppPartitionDu & partitionDu )
250 : QY2DiskUsageListItem( parent )
251 , _partitionDu( partitionDu )
252 , _pkgDiskUsageList( parent )
254 y2debug( "disk usage list entry for %s", partitionDu.dir.c_str() );
259 YQPkgDiskUsageListItem::usedSize() const
261 return FSize( _partitionDu.pkg_size, FSize::K );
266 YQPkgDiskUsageListItem::totalSize() const
268 return FSize( _partitionDu.total_size, FSize::K );
273 YQPkgDiskUsageListItem::name() const
275 return fromUTF8( _partitionDu.dir.c_str() );
280 YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData )
282 _partitionDu = fromData;
284 checkRemainingDiskSpace();
289 YQPkgDiskUsageListItem::checkRemainingDiskSpace()
291 int percent = usedPercent();
292 int free = freeSize() / FSize::MB;
294 if ( percent > MIN_PERCENT_WARN )
296 // Modern hard disks can be huge, so a warning based on percentage only
297 // can be misleading - check the absolute value, too.
299 if ( free < MIN_FREE_MB_PROXIMITY )
300 _pkgDiskUsageList->runningOutWarning.enterProximity();
302 if ( free < MIN_FREE_MB_WARN )
303 _pkgDiskUsageList->runningOutWarning.enterRange();
306 if ( free < MIN_FREE_MB_PROXIMITY )
308 if ( percent > MIN_PERCENT_PROXIMITY )
309 _pkgDiskUsageList->runningOutWarning.enterProximity();
312 if ( free < OVERFLOW_MB_WARN )
313 _pkgDiskUsageList->overflowWarning.enterRange();
315 if ( free < OVERFLOW_MB_PROXIMITY )
316 _pkgDiskUsageList->overflowWarning.enterProximity();
324 YQPkgWarningRangeNotifier::YQPkgWarningRangeNotifier()
331 YQPkgWarningRangeNotifier::clear()
334 _hasBeenClose = _isClose;
340 YQPkgWarningRangeNotifier::clearHistory()
343 _hasBeenClose = false;
344 _warningPosted = false;
349 YQPkgWarningRangeNotifier::enterRange()
357 YQPkgWarningRangeNotifier::enterProximity()
360 _hasBeenClose = true;
365 YQPkgWarningRangeNotifier::warningPostedNotify()
367 _warningPosted = true;
372 YQPkgWarningRangeNotifier::inRange() const
379 YQPkgWarningRangeNotifier::leavingProximity() const
381 return ! _isClose && ! _hasBeenClose;
386 YQPkgWarningRangeNotifier::needWarning() const
388 return _inRange && ! _warningPosted;
394 #include "YQPkgDiskUsageList.moc"