- progress meter cosmetics
[apt.git] / apt-pkg / contrib / progress.cc
index 65482e8..3761df9 100644 (file)
@@ -18,6 +18,7 @@
 #include <apti18n.h>
 
 #include <iostream>
+#include <iomanip>
 #include <stdio.h>
                                                                        /*}}}*/
 
@@ -110,8 +111,10 @@ bool OpProgress::CheckChange(float Interval)
    if (SubOp != LastSubOp)
    {
       LastSubOp = SubOp;
+      SubChange = true;
       return true;
    }
+   SubChange = false;
    
    if ((int)LastPercent == (int)Percent)
       return false;
@@ -218,3 +221,85 @@ void OpTextProgress::Write(const char *S)
    LastLen = strlen(S);
 }
                                                                        /*}}}*/
+
+InstPercentProgress::InstPercentProgress(Configuration &Config) : 
+                               InstProgress(Config)
+{
+}
+
+void InstPercentProgress::Done()
+{
+   Percent = 100;
+   Update();
+}
+                                                                       /*}}}*/
+void InstPercentProgress::Update()
+{
+   if (CheckChange(0.001) == false)
+      return;
+
+   //cout << "major " << Op << " " << MajorChange << " new " << SubOp << " changed " << SubChange << endl << flush;
+   if (MajorChange == true)
+      return;
+   if (SubChange == true) {
+      if (State == Preparing) {
+        cout << SubOp << endl << flush;
+      } else if (State == Installing) {
+        cout << (*PackageData)["name"] << "-";
+        cout << (*PackageData)["version"] << "-";
+        cout << (*PackageData)["release"];
+        cout << endl << flush;
+      }
+   } else if (State == Installing or State == Preparing) {
+      cout.setf(ios_base::showpoint);
+      cout.setf(ios_base::fixed, ios_base::floatfield);
+      cout << "%% " << setprecision(6) << Percent << endl << flush;
+   }
+}
+
+void InstHashProgress::Update()
+{
+   if (CheckChange(0.000001) == false)
+      return;
+
+   if (MajorChange == true) {
+      cout << endl << Op << flush;
+      return;
+   }
+   if (SubChange == true) {
+      cout << endl << flush;
+   }
+   string s;
+   if (State == Preparing) {
+      s = SubOp; 
+   } else {
+      s = (*PackageData)["name"] + "-" + 
+          (*PackageData)["version"] + "-" + 
+          (*PackageData)["release"]; 
+   }
+   cout << "\r";
+   cout.setf(ios_base::left);
+   cout << setw(25) << s << " ";
+   PrintHashes();
+}
+
+void InstHashProgress::PrintHashes()
+{
+   int hashesTotal = 44;
+   int hashesNeeded = int(hashesTotal * Percent / 100);
+           
+   cout << setw(hashesNeeded) << setfill('#') << "";
+   cout << setw(hashesTotal-hashesNeeded) << setfill(' ') << "";
+   cout.setf(ios_base::left);
+   cout << " [" << setw(3) << int(Percent) << "%]";
+   cout << flush;
+}
+
+void InstHashProgress::Done()
+{
+   Percent = 100;
+   Update();
+   cout << endl;
+}
+
+// vim:sts=3:sw=3