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>
25 #include <QHeaderView>
28 #include <zypp/ZYppFactory.h>
31 #include "YQPkgDiskUsageList.h"
32 #include "YQPkgDiskUsageWarningDialog.h"
39 // Warning ranges for "disk space is running out" or "disk space overflow".
40 // The WARN value triggers a warning popup once ( ! ). The warning will not be
41 // displayed again until the value sinks below the PROXIMITY value and then
42 // increases again to the WARN value.
44 // See class YQPkgWarningRangeNotifier in file YQPkgDiskUsageList.h for details.
46 #define MIN_FREE_MB_WARN 400
47 #define MIN_FREE_MB_PROXIMITY 700
49 #define MIN_PERCENT_WARN 90
50 #define MIN_PERCENT_PROXIMITY 80
52 #define OVERFLOW_MB_WARN 0
53 #define OVERFLOW_MB_PROXIMITY 300
56 typedef zypp::DiskUsageCounter::MountPointSet ZyppDuSet;
57 typedef zypp::DiskUsageCounter::MountPointSet::iterator ZyppDuSetIterator;
61 YQPkgDiskUsageList::YQPkgDiskUsageList( QWidget * parent, int thresholdPercent )
62 : QY2DiskUsageList( parent, true )
66 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
68 if ( diskUsage.empty() )
70 zypp::getZYpp()->setPartitions( zypp::DiskUsageCounter::detectMountPoints() );
71 diskUsage = zypp::getZYpp()->diskUsage();
75 for ( ZyppDuSetIterator it = diskUsage.begin();
76 it != diskUsage.end();
79 const ZyppPartitionDu & partitionDu = *it;
81 if ( ! partitionDu.readonly )
83 YQPkgDiskUsageListItem * item = new YQPkgDiskUsageListItem( this, partitionDu );
86 _items.insert( QString::fromUtf8(partitionDu.dir.c_str()), item );
94 YQPkgDiskUsageList::updateDiskUsage()
96 runningOutWarning.clear();
97 overflowWarning.clear();
99 ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage();
101 for ( ZyppDuSetIterator it = diskUsage.begin();
102 it != diskUsage.end();
105 const ZyppPartitionDu & partitionDu = *it;
106 YQPkgDiskUsageListItem * item = _items[ QString::fromUtf8(partitionDu.dir.c_str()) ];
109 item->updateDuData( partitionDu );
111 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
153 int width = header()->headerWidth()
154 + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() );
156 int width = header()->sizeHint().width()
160 return QSize( width, 100 );
165 YQPkgDiskUsageList::keyPressEvent( QKeyEvent * event )
170 unsigned special_combo = ( Qt::ControlModifier| Qt::ShiftModifier | Qt::AltModifier );
172 if ( ( event->modifiers() & special_combo ) == special_combo )
174 if ( event->key() == Qt::Key_Q )
177 y2milestone( "Debug mode %s", _debug ? "on" : "off" );
182 if ( _debug && currentItem() )
184 YQPkgDiskUsageListItem * item = dynamic_cast<YQPkgDiskUsageListItem *> ( currentItem() );
189 int percent = item->usedPercent();
191 switch ( event->key() )
193 case Qt::Key_1: percent = 10; break;
194 case Qt::Key_2: percent = 20; break;
195 case Qt::Key_3: percent = 30; break;
196 case Qt::Key_4: percent = 40; break;
197 case Qt::Key_5: percent = 50; break;
198 case Qt::Key_6: percent = 60; break;
199 case Qt::Key_7: percent = 70; break;
200 case Qt::Key_8: percent = 80; break;
201 case Qt::Key_9: percent = 90; break;
202 case Qt::Key_0: percent = 100; break;
203 case Qt::Key_Plus: percent += 3; break;
204 case Qt::Key_Minus: percent -= 3; break;
207 // Only for testing, thus intentionally using no translations
208 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Warning:</b> Disk space is running out!",
213 YQPkgDiskUsageWarningDialog::diskUsageWarning( "<b>Error:</b> Out of disk space!",
214 100, "&Continue anyway", "&Cancel" );
221 ZyppPartitionDu partitionDu( item->partitionDu() );
223 if ( percent != item->usedPercent() )
225 partitionDu.pkg_size = partitionDu.total_size * percent / 100;
227 runningOutWarning.clear();
228 overflowWarning.clear();
230 item->updateDuData( partitionDu );
231 postPendingWarnings();
238 QY2DiskUsageList::keyPressEvent( event );
246 YQPkgDiskUsageListItem::YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent,
247 const ZyppPartitionDu & partitionDu )
248 : QY2DiskUsageListItem( parent )
249 , _partitionDu( partitionDu )
250 , _pkgDiskUsageList( parent )
252 y2debug( "disk usage list entry for %s", partitionDu.dir.c_str() );
257 YQPkgDiskUsageListItem::usedSize() const
259 return FSize( _partitionDu.pkg_size, FSize::K );
264 YQPkgDiskUsageListItem::totalSize() const
266 return FSize( _partitionDu.total_size, FSize::K );
271 YQPkgDiskUsageListItem::name() const
273 return fromUTF8( _partitionDu.dir.c_str() );
278 YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData )
280 _partitionDu = fromData;
282 checkRemainingDiskSpace();
287 YQPkgDiskUsageListItem::checkRemainingDiskSpace()
289 int percent = usedPercent();
290 int free = freeSize() / FSize::MB;
292 if ( percent > MIN_PERCENT_WARN )
294 // Modern hard disks can be huge, so a warning based on percentage only
295 // can be misleading - check the absolute value, too.
297 if ( free < MIN_FREE_MB_PROXIMITY )
298 _pkgDiskUsageList->runningOutWarning.enterProximity();
300 if ( free < MIN_FREE_MB_WARN )
301 _pkgDiskUsageList->runningOutWarning.enterRange();
304 if ( free < MIN_FREE_MB_PROXIMITY )
306 if ( percent > MIN_PERCENT_PROXIMITY )
307 _pkgDiskUsageList->runningOutWarning.enterProximity();
310 if ( free < OVERFLOW_MB_WARN )
311 _pkgDiskUsageList->overflowWarning.enterRange();
313 if ( free < OVERFLOW_MB_PROXIMITY )
314 _pkgDiskUsageList->overflowWarning.enterProximity();
322 YQPkgWarningRangeNotifier::YQPkgWarningRangeNotifier()
329 YQPkgWarningRangeNotifier::clear()
332 _hasBeenClose = _isClose;
338 YQPkgWarningRangeNotifier::clearHistory()
341 _hasBeenClose = false;
342 _warningPosted = false;
347 YQPkgWarningRangeNotifier::enterRange()
355 YQPkgWarningRangeNotifier::enterProximity()
358 _hasBeenClose = true;
363 YQPkgWarningRangeNotifier::warningPostedNotify()
365 _warningPosted = true;
370 YQPkgWarningRangeNotifier::inRange() const
377 YQPkgWarningRangeNotifier::leavingProximity() const
379 return ! _isClose && ! _hasBeenClose;
384 YQPkgWarningRangeNotifier::needWarning() const
386 return _inRange && ! _warningPosted;
392 #include "YQPkgDiskUsageList.moc"