1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
13 File: YQPkgDiskUsageList.cc
15 Author: Stefan Hundhammer <sh@suse.de>
17 Textdomain "packages-qt"
23 #define y2log_component "qt-pkg"
24 #include <ycp/y2log.h>
28 #include <QHeaderView>
32 #include <zypp/ZYppFactory.h>
35 #include "YQPkgDiskUsageList.h"
36 #include "YQPkgDiskUsageWarningDialog.h"
43 // Warning ranges for "disk space is running out" or "disk space overflow".
44 // The WARN value triggers a warning popup once ( ! ). The warning will not be
45 // displayed again until the value sinks below the PROXIMITY value and then
46 // increases again to the WARN value.
48 // See class YQPkgWarningRangeNotifier in file YQPkgDiskUsageList.h for details.
50 #define MIN_FREE_MB_WARN 400
51 #define MIN_FREE_MB_PROXIMITY 700
53 #define MIN_PERCENT_WARN 90
54 #define MIN_PERCENT_PROXIMITY 80
56 #define OVERFLOW_MB_WARN 0
57 #define OVERFLOW_MB_PROXIMITY 300
60 typedef zypp::DiskUsageCounter::MountPointSet ZyppDuSet;
61 typedef zypp::DiskUsageCounter::MountPointSet::iterator ZyppDuSetIterator;
65 YQPkgDiskUsageList::YQPkgDiskUsageList( QWidget * parent, int thresholdPercent )
66 : QY2DiskUsageList( parent, true )
70 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
72 if ( diskUsage.empty() )
74 zypp::getZYpp()->setPartitions( zypp::DiskUsageCounter::detectMountPoints() );
75 diskUsage = zypp::getZYpp()->diskUsage();
79 for ( ZyppDuSetIterator it = diskUsage.begin();
80 it != diskUsage.end();
83 const ZyppPartitionDu & partitionDu = *it;
85 if ( ! partitionDu.readonly )
87 YQPkgDiskUsageListItem * item = new YQPkgDiskUsageListItem( this, partitionDu );
90 _items.insert( partitionDu.dir.c_str(), item );
98 YQPkgDiskUsageList::updateDiskUsage()
100 runningOutWarning.clear();
101 overflowWarning.clear();
103 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
105 for ( ZyppDuSetIterator it = diskUsage.begin();
106 it != diskUsage.end();
109 const ZyppPartitionDu & partitionDu = *it;
110 YQPkgDiskUsageListItem * item = _items[ partitionDu.dir.c_str() ];
113 item->updateDuData( partitionDu );
115 y2error( "No entry for mount point %s", partitionDu.dir.c_str() );
121 postPendingWarnings();
126 YQPkgDiskUsageList::postPendingWarnings()
128 if ( overflowWarning.needWarning() )
130 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Error:</b> Out of disk space!" ),
133 overflowWarning.warningPostedNotify();
134 runningOutWarning.warningPostedNotify(); // Suppress this ( now redundant ) other warning
137 if ( runningOutWarning.needWarning() )
139 YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "<b>Warning:</b> Disk space is running out!" ) ,
140 MIN_PERCENT_WARN, _( "&OK" ) );
141 runningOutWarning.warningPostedNotify();
144 if ( overflowWarning.leavingProximity() )
145 overflowWarning.clearHistory();
147 if ( runningOutWarning.leavingProximity() )
148 runningOutWarning.clearHistory();
153 YQPkgDiskUsageList::sizeHint() const
157 int width = header()->headerWidth()
158 + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
160 int width = header()->sizeHint().width()
164 return QSize( width, 100 );
169 YQPkgDiskUsageList::keyPressEvent( QKeyEvent * event )
174 unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton );
176 if ( ( event->state() & special_combo ) == special_combo )
178 if ( event->key() == Qt::Key_Q )
181 y2milestone( "Debug mode %s", _debug ? "on" : "off" );
186 if ( _debug && currentItem() )
188 YQPkgDiskUsageListItem * item = dynamic_cast<YQPkgDiskUsageListItem *> ( currentItem() );
193 int percent = item->usedPercent();
195 switch ( event->ascii() )
197 case '1': percent = 10; break;
198 case '2': percent = 20; break;
199 case '3': percent = 30; break;
200 case '4': percent = 40; break;
201 case '5': percent = 50; break;
202 case '6': percent = 60; break;
203 case '7': percent = 70; break;
204 case '8': percent = 80; break;
205 case '9': percent = 90; break;
206 case '0': percent = 100; break;
207 case '+': percent += 3; break;
208 case '-': percent -= 3; break;
211 // Only for testing, thus intentionally using no translations
212 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Warning:</b> Disk space is running out!",
217 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Error:</b> Out of disk space!",
218 100, "&Continue anyway", "&Cancel" );
225 ZyppPartitionDu partitionDu( item->partitionDu() );
227 if ( percent != item->usedPercent() )
229 partitionDu.pkg_size = partitionDu.total_size * percent / 100;
231 runningOutWarning.clear();
232 overflowWarning.clear();
234 item->updateDuData( partitionDu );
235 postPendingWarnings();
242 QY2DiskUsageList::keyPressEvent( event );
250 YQPkgDiskUsageListItem::YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent,
251 const ZyppPartitionDu & partitionDu )
252 : QY2DiskUsageListItem( parent )
253 , _partitionDu( partitionDu )
254 , _pkgDiskUsageList( parent )
256 y2debug( "disk usage list entry for %s", partitionDu.dir.c_str() );
261 YQPkgDiskUsageListItem::usedSize() const
263 return FSize( _partitionDu.pkg_size, FSize::K );
268 YQPkgDiskUsageListItem::totalSize() const
270 return FSize( _partitionDu.total_size, FSize::K );
275 YQPkgDiskUsageListItem::name() const
277 return fromUTF8( _partitionDu.dir.c_str() );
282 YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData )
284 _partitionDu = fromData;
286 checkRemainingDiskSpace();
291 YQPkgDiskUsageListItem::checkRemainingDiskSpace()
293 int percent = usedPercent();
294 int free = freeSize() / FSize::MB;
296 if ( percent > MIN_PERCENT_WARN )
298 // Modern hard disks can be huge, so a warning based on percentage only
299 // can be misleading - check the absolute value, too.
301 if ( free < MIN_FREE_MB_PROXIMITY )
302 _pkgDiskUsageList->runningOutWarning.enterProximity();
304 if ( free < MIN_FREE_MB_WARN )
305 _pkgDiskUsageList->runningOutWarning.enterRange();
308 if ( free < MIN_FREE_MB_PROXIMITY )
310 if ( percent > MIN_PERCENT_PROXIMITY )
311 _pkgDiskUsageList->runningOutWarning.enterProximity();
314 if ( free < OVERFLOW_MB_WARN )
315 _pkgDiskUsageList->overflowWarning.enterRange();
317 if ( free < OVERFLOW_MB_PROXIMITY )
318 _pkgDiskUsageList->overflowWarning.enterProximity();
326 YQPkgWarningRangeNotifier::YQPkgWarningRangeNotifier()
333 YQPkgWarningRangeNotifier::clear()
336 _hasBeenClose = _isClose;
342 YQPkgWarningRangeNotifier::clearHistory()
345 _hasBeenClose = false;
346 _warningPosted = false;
351 YQPkgWarningRangeNotifier::enterRange()
359 YQPkgWarningRangeNotifier::enterProximity()
362 _hasBeenClose = true;
367 YQPkgWarningRangeNotifier::warningPostedNotify()
369 _warningPosted = true;
374 YQPkgWarningRangeNotifier::inRange() const
381 YQPkgWarningRangeNotifier::leavingProximity() const
383 return ! _isClose && ! _hasBeenClose;
388 YQPkgWarningRangeNotifier::needWarning() const
390 return _inRange && ! _warningPosted;
396 #include "YQPkgDiskUsageList.moc"