From 8796693db14401591ce93c06361ff84bce43c498 Mon Sep 17 00:00:00 2001
From: "benjamin.jakimow" <benjamin.jakimow@geo.hu-berlin.de>
Date: Fri, 8 Jan 2016 15:16:17 +0100
Subject: [PATCH] now loads specified dates / time window only scrollwindow
 focusses on specified date

---
 sensecarbon_tsv.py          | 153 ++++++++++++-------
 sensecarbon_tsv_gui_base.ui | 291 ++++++++++++++----------------------
 2 files changed, 211 insertions(+), 233 deletions(-)

diff --git a/sensecarbon_tsv.py b/sensecarbon_tsv.py
index 35e9f607..251c19bd 100644
--- a/sensecarbon_tsv.py
+++ b/sensecarbon_tsv.py
@@ -146,7 +146,7 @@ class TimeSeriesTableModel(QAbstractTableModel):
         elif role == Qt.BackgroundColorRole:
             value = None
         elif role == Qt.UserRole:
-            value = self._data[index.row()]
+            value = TSD
 
         return value
 
@@ -904,6 +904,10 @@ class SenseCarbon_TSV:
         # Save reference to the QGIS interface
         self.iface = iface
 
+
+        #if isinstance(iface, QgsApplication):
+        #self.iface = iface
+
         # initialize plugin directory
         self.plugin_dir = os.path.dirname(__file__)
         # initialize locale
@@ -925,16 +929,17 @@ class SenseCarbon_TSV:
         self.dlg = SenseCarbon_TSVGui()
         D = self.dlg
         self.TS = TimeSeries()
+        TSM = TimeSeriesTableModel(self.TS)
+        D.tableView_TimeSeries.setModel(TSM)
+        D.tableView_TimeSeries.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
+        D.cb_centerdate.setModel(TSM)
+        D.cb_centerdate.setModelColumn(0)
+        D.cb_centerdate.currentIndexChanged.connect(self.scrollToDate)
         self.TS.datumAdded.connect(self.ua_datumAdded)
         self.TS.progress.connect(self.ua_TSprogress)
         self.TS.chipLoaded.connect(self.ua_showPxCoordinate_addChips)
 
 
-        TSM = TimeSeriesTableModel(self.TS)
-        D.tableView_TimeSeries.setModel(TSM)
-        D.tableView_TimeSeries.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
-        D.cb_timeWindow_doi.setModel(TSM)
-        D.cb_timeWindow_doi.setModelColumn(0)
 
         self.VIEWS = list()
         self.ImageChipBuffer = ImageChipBuffer()
@@ -970,9 +975,10 @@ class SenseCarbon_TSV:
             self.RectangleMapTool.rectangleDrawed.connect(self.ua_selectBy_Response)
             self.PointMapTool = qgis_add_ins.PointMapTool(self.canvas)
             self.PointMapTool.coordinateSelected.connect(self.ua_selectBy_Response)
-            #self.RectangleMapTool..connect(self.ua_selectByRectangle_Done)
+            #self.RectangleMapTool.connect(self.ua_selectByRectangle_Done)
 
         self.CPV = self.dlg.scrollAreaWidgetContents.layout()
+
         self.check_enabled()
         s = ""
 
@@ -1042,8 +1048,6 @@ class SenseCarbon_TSV:
         P.setValue(v)
 
     def ua_datumAdded(self):
-        cb_centerdate = self.dlg.cb_centerdate
-        cb_centerdate.clear()
         if len(self.TS) > 0:
             if self.dlg.spinBox_coordinate_x.value() == 0.0 and \
                self.dlg.spinBox_coordinate_y.value() == 0.0:
@@ -1052,11 +1056,8 @@ class SenseCarbon_TSV:
                 self.dlg.spinBox_coordinate_y.setRange(ymin, ymax)
                 self.dlg.spinBox_coordinate_x.setValue(0.5*(xmin+xmax))
                 self.dlg.spinBox_coordinate_y.setValue(0.5*(ymin+ymax))
-                s =""
-
-                for date in self.TS.getDates():
-                    cb_centerdate.addItem(date.astype('str'), date)
-            s = ""
+                s = ""
+        self.dlg.cb_centerdate.setCurrentIndex(int(len(self.TS) / 2))
         self.dlg.tableView_TimeSeries.resizeColumnsToContents()
 
     def check_enabled(self):
@@ -1243,26 +1244,25 @@ class SenseCarbon_TSV:
 
         #get the dates of interes
         dates_of_interest = list()
+        centerTSD = D.cb_centerdate.itemData(D.cb_centerdate.currentIndex())
+        if centerTSD is None:
+            idx = int(len(self.TS)/2)
+            centerTSD = D.cb_centerdate.itemData(idx)
+            D.cb_centerdate.setCurrentIndex(idx)
+        centerDate = centerTSD.getDate()
+        allDates = self.TS.getDates()
+        i_doi = allDates.index(centerDate)
+
         if D.rb_showEntireTS.isChecked():
             dates_of_interest = self.TS.getDates()
-        elif D.rb_showSelectedDates.isChecked():
-            dates_of_interest = self.getSelectedDates()
         elif D.rb_showTimeWindow.isChecked():
-            TSD = D.cb_timeWindow_doi.itemData(D.cb_timeWindow_doi.currentIndex())
-            s = ""
-            allDates = self.TS.getDates()
-            i_doi = allDates.index(TSD)
             i0 = max([0, i_doi-D.sb_ndates_before.value()])
-            ie = min([i_doi + D.sb_ndates_after.value(), len(allDates)])
-            dates_of_interest = allDates[i0:ie]
+            ie = min([i_doi + D.sb_ndates_after.value(), len(allDates)-1])
+            dates_of_interest = allDates[i0:ie+1]
 
 
-        if self.CPV is None:
-            ScrollArea.setLayout(QHBoxLayout())
-            self.CPV = ScrollArea.layout()
-        else:
-            diff = set(dates_of_interest)
-            diff = diff.symmetric_difference(self.CHIPWIDGETS.keys())
+        diff = set(dates_of_interest)
+        diff = diff.symmetric_difference(self.CHIPWIDGETS.keys())
 
         self.clearLayoutWidgets(self.CPV)
         self.CHIPWIDGETS.clear()
@@ -1285,27 +1285,37 @@ class SenseCarbon_TSV:
             TSD = self.TS.data[date]
             textLabel = QLabel('{}'.format(date.astype(str)))
             textLabel.setToolTip(str(TSD))
-            #textLabel.setMinimumWidth(size_x)
-            #textLabel.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
             self.CPV.addWidget(textLabel, 0, i)
             viewList = list()
-            for j, view in enumerate(self.VIEWS):
+            j = 1
+            for view in self.VIEWS:
                 imageLabel = QLabel()
                 imageLabel.setFrameShape(QFrame.StyledPanel)
                 imageLabel.setMinimumSize(size_x, size_y)
                 imageLabel.setMaximumSize(size_x+1, size_y+1)
                 imageLabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
                 viewList.append(imageLabel)
-                self.CPV.addWidget(imageLabel,j+1, i)
+                self.CPV.addWidget(imageLabel,j, i)
+                j += 1
+
+            textLabel = QLabel('{}'.format(date.astype(str)))
+            textLabel.setToolTip(str(TSD))
+            self.CPV.addWidget(textLabel, j, i)
+
             self.CHIPWIDGETS[date] = viewList
 
-        #LH.addSpacerItem(Spacer(size_x, size_y))
-        ScrollArea.show()
+        self.scrollToDate(centerDate)
+
+        s = ""
+        #ScrollArea.show()
+        #ScrollArea.horizontalScrollBar().setValue()
+
+
 
         #fill image labels
         missing_dates = set()
         missing_bands = set()
-        for i, date in enumerate(self.TS.getDates()):
+        for i, date in enumerate(dates_of_interest):
             required_bands = set()
             for j, view in enumerate(self.VIEWS):
                 required_bands = required_bands.union(set(view.getBands()))
@@ -1317,8 +1327,28 @@ class SenseCarbon_TSV:
                 missing_dates.add(date)
                 missing_bands = missing_bands.union(missing)
 
+        missing_dates = list(missing_dates)
         if len(missing_dates) > 0:
-            self.TS.getSpatialChips_parallel(bbWkt, srsWkt, dates=list(missing_dates), bands=list(missing_bands))
+            missing_dates = sorted(missing_dates, key=lambda d: abs(centerDate - d))
+            self.TS.getSpatialChips_parallel(bbWkt, srsWkt, dates=missing_dates, bands=list(missing_bands))
+
+    def scrollToDate(self, date):
+        QApplication.processEvents()
+        HBar = self.dlg.scrollArea.horizontalScrollBar()
+        dates = list(self.CHIPWIDGETS.keys())
+        if len(dates) == 0:
+            return
+
+        #get date INDEX that is closest to requested date
+        if not isinstance(date, int):
+            i_doi = dates.index(sorted(dates, key=lambda d: abs(date - d))[0])
+        else:
+            i_doi = min([date, HBar.maximum()])
+
+        scrollValue = int(float(i_doi+1) / len(dates) * HBar.maximum())
+
+        HBar.setValue(scrollValue)
+
 
     def ua_showPxCoordinate_addChips(self, results, date=None):
 
@@ -1328,6 +1358,10 @@ class SenseCarbon_TSV:
 
         viewList = self.CHIPWIDGETS.get(date)
 
+
+
+
+
         if viewList:
             for j, view in enumerate(self.VIEWS):
 
@@ -1452,6 +1486,7 @@ class SenseCarbon_TSV:
         L.removeWidget(w)
         w.deleteLater()
         self.setViewNames()
+
     def getSelectedDates(self):
         TV = self.dlg.tableView_TimeSeries
         TVM = TV.model()
@@ -1470,23 +1505,25 @@ def run_tests():
 
         pathImg = r'O:\SenseCarbonProcessing\BJ_NOC\01_RasterData\00_VRTs\02_Cutted\2014-07-26_LC82270652014207LGN00_BOA.vrt'
         pathMsk = r'O:\SenseCarbonProcessing\BJ_NOC\01_RasterData\00_VRTs\02_Cutted\2014-07-26_LC82270652014207LGN00_Msk.vrt'
-        TSD = TimeSeriesDatum(pathImg)
-        TSD.setMask(pathMsk)
 
-        print(TSD)
+        if False:
+            TSD = TimeSeriesDatum(pathImg)
+            TSD.setMask(pathMsk)
 
-        c = [670949.883,-786288.771]
+            print(TSD)
 
-        w_x = w_y = 1000 #1km box
-        srs = TSD.getSpatialReference()
-        ring = ogr.Geometry(ogr.wkbLinearRing)
-        import itertools
-        for x,y in itertools.product([1000, -1000], repeat=2):
-            ring.AddPoint(c[0]+x, c[1]+y)
-        ring.AssignSpatialReference(srs)
-        bb = ogr.Geometry(ogr.wkbPolygon)
-        bb.AddGeometry(ring)
-        bb.AssignSpatialReference(srs)
+            c = [670949.883,-786288.771]
+
+            w_x = w_y = 1000 #1km box
+            srs = TSD.getSpatialReference()
+            ring = ogr.Geometry(ogr.wkbLinearRing)
+            import itertools
+            for x,y in itertools.product([1000, -1000], repeat=2):
+                ring.AddPoint(c[0]+x, c[1]+y)
+            ring.AssignSpatialReference(srs)
+            bb = ogr.Geometry(ogr.wkbPolygon)
+            bb.AddGeometry(ring)
+            bb.AssignSpatialReference(srs)
 
 
 
@@ -1518,9 +1555,9 @@ def run_tests():
         range_b = [0,500]
 
         bands = [3,2,1]
-        chipData = TSD.readSpatialChip(bb,bands=bands )
+        #chipData = TSD.readSpatialChip(bb,bands=bands )
 
-        main.addNumpy(getChip3d(chipData, bands, (range_r, range_g, range_b)))
+        #main.addNumpy(getChip3d(chipData, bands, (range_r, range_g, range_b)))
         app.exec_()
         exit(0)
 
@@ -1536,29 +1573,29 @@ def run_tests():
 
     if True:
         import PyQt4.Qt
-        a = PyQt4.Qt.QApplication([])
 
+        app=PyQt4.Qt.QApplication([])
         S = SenseCarbon_TSV(None)
         S.run()
 
         if True:
-            dirSrc = r'O:\SenseCarbonProcessing\BJ_NOC\01_RasterData\00_VRTs\02_Cutted'
-            filesImg = file_search(dirSrc, '2014*_BOA.vrt')
+            dirSrc = r'\\141.20.140.107\NAS_Processing\SenseCarbonProcessing\BJ_NOC\01_RasterData\02_CuttedVRT'
+            filesImg = file_search(dirSrc, '20*_BOA.vrt')
             #filesMsk = file_search(dirSrc, '2014*_Msk.vrt')
             #S.ua_addTSImages(files=filesImg[0:1])
-            #S.ua_addTSImages(files=filesImg)
+            S.ua_addTSImages(files=filesImg)
             #S.ua_addTSMasks(files=filesMsk)
 
         #S.ua_addView(bands=[4,5,3])
 
-        a.exec_()
+        app.exec_()
 
     if False:
         import qgis.core
 
         # supply path to where is your qgis installed
 
-        QgsApplication.setPrefixPath("/Applications/QGIS_2.12.app/Contents/MacOS/QGIS", True)
+        #QgsApplication.setPrefixPath("/Applications/QGIS_2.12.app/Contents/MacOS/QGIS", True)
 
         # load providers
         QgsApplication.initQgis()
diff --git a/sensecarbon_tsv_gui_base.ui b/sensecarbon_tsv_gui_base.ui
index 5bc5809e..e3b73870 100644
--- a/sensecarbon_tsv_gui_base.ui
+++ b/sensecarbon_tsv_gui_base.ui
@@ -372,6 +372,19 @@
            </layout>
           </widget>
          </item>
+         <item>
+          <spacer name="verticalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
          <item>
           <widget class="QGroupBox" name="groupBox_rendering">
            <property name="minimumSize">
@@ -384,31 +397,21 @@
             <string>Chip Rendering</string>
            </property>
            <layout class="QGridLayout" name="gridLayout_2">
-            <item row="2" column="0">
+            <item row="6" column="0">
              <widget class="QLabel" name="label_6">
               <property name="text">
                <string>First date</string>
               </property>
              </widget>
             </item>
-            <item row="0" column="0">
-             <widget class="QLabel" name="label_11">
-              <property name="text">
-               <string>max. size </string>
-              </property>
-             </widget>
-            </item>
-            <item row="2" column="1" colspan="2">
-             <widget class="QComboBox" name="cb_centerdate"/>
-            </item>
-            <item row="1" column="1">
+            <item row="5" column="1">
              <widget class="QSpinBox" name="spinBox_ncpu">
               <property name="toolTip">
                <string>Number of CPUs used for parallel image chip calculation</string>
               </property>
              </widget>
             </item>
-            <item row="0" column="1">
+            <item row="4" column="1">
              <widget class="QSpinBox" name="spinBox_chipsize_max">
               <property name="minimumSize">
                <size>
@@ -436,14 +439,24 @@
               </property>
              </widget>
             </item>
-            <item row="1" column="0">
+            <item row="6" column="1" colspan="2">
+             <widget class="QComboBox" name="cb_centerdate"/>
+            </item>
+            <item row="4" column="0">
+             <widget class="QLabel" name="label_11">
+              <property name="text">
+               <string>max. size </string>
+              </property>
+             </widget>
+            </item>
+            <item row="5" column="0">
              <widget class="QLabel" name="label">
               <property name="text">
                <string>#cpu</string>
               </property>
              </widget>
             </item>
-            <item row="0" column="2">
+            <item row="4" column="2">
              <spacer name="horizontalSpacer_2">
               <property name="orientation">
                <enum>Qt::Horizontal</enum>
@@ -456,22 +469,94 @@
               </property>
              </spacer>
             </item>
+            <item row="0" column="0">
+             <widget class="QRadioButton" name="rb_showEntireTS">
+              <property name="text">
+               <string>Entire Time Series</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QRadioButton" name="rb_showTimeWindow">
+              <property name="toolTip">
+               <string>Select </string>
+              </property>
+              <property name="text">
+               <string>Time Window:</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="0" rowspan="2" colspan="3">
+             <widget class="QFrame" name="frame_2">
+              <property name="minimumSize">
+               <size>
+                <width>50</width>
+                <height>50</height>
+               </size>
+              </property>
+              <property name="frameShape">
+               <enum>QFrame::StyledPanel</enum>
+              </property>
+              <property name="frameShadow">
+               <enum>QFrame::Raised</enum>
+              </property>
+              <layout class="QHBoxLayout" name="horizontalLayout_3">
+               <item>
+                <widget class="QLabel" name="label_8">
+                 <property name="text">
+                  <string>before</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="sb_ndates_before">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                 <property name="value">
+                  <number>1</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QLabel" name="label_9">
+                 <property name="text">
+                  <string>after</string>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <widget class="QSpinBox" name="sb_ndates_after">
+                 <property name="maximum">
+                  <number>9999</number>
+                 </property>
+                 <property name="value">
+                  <number>1</number>
+                 </property>
+                </widget>
+               </item>
+               <item>
+                <spacer name="horizontalSpacer_3">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>40</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
+              </layout>
+             </widget>
+            </item>
            </layout>
           </widget>
          </item>
-         <item>
-          <spacer name="verticalSpacer_4">
-           <property name="orientation">
-            <enum>Qt::Vertical</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>20</width>
-             <height>40</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
         </layout>
        </widget>
        <widget class="QWidget" name="tab_spectral">
@@ -531,8 +616,8 @@
              <rect>
               <x>0</x>
               <y>0</y>
-              <width>81</width>
-              <height>28</height>
+              <width>262</width>
+              <height>376</height>
              </rect>
             </property>
             <property name="sizePolicy">
@@ -547,133 +632,6 @@
          </item>
         </layout>
        </widget>
-       <widget class="QWidget" name="tab_temporal">
-        <attribute name="title">
-         <string>Temporal</string>
-        </attribute>
-        <layout class="QFormLayout" name="formLayout">
-         <property name="fieldGrowthPolicy">
-          <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
-         </property>
-         <item row="0" column="0">
-          <widget class="QRadioButton" name="rb_showEntireTS">
-           <property name="text">
-            <string>Entire Time Series</string>
-           </property>
-           <property name="checked">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0">
-          <widget class="QRadioButton" name="rb_showSelectedDates">
-           <property name="text">
-            <string>Selected Dates</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0">
-          <widget class="QRadioButton" name="rb_showTimeWindow">
-           <property name="text">
-            <string>Time Window</string>
-           </property>
-          </widget>
-         </item>
-         <item row="3" column="0" colspan="2">
-          <widget class="QFrame" name="frame_timewindow">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="frameShape">
-            <enum>QFrame::StyledPanel</enum>
-           </property>
-           <property name="frameShadow">
-            <enum>QFrame::Raised</enum>
-           </property>
-           <layout class="QFormLayout" name="formLayout_2">
-            <property name="fieldGrowthPolicy">
-             <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
-            </property>
-            <item row="0" column="0">
-             <widget class="QLabel" name="label_7">
-              <property name="text">
-               <string>Date of interest</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="1">
-             <widget class="QComboBox" name="cb_timeWindow_doi"/>
-            </item>
-            <item row="3" column="0" colspan="2">
-             <widget class="QFrame" name="frame_2">
-              <property name="minimumSize">
-               <size>
-                <width>50</width>
-                <height>20</height>
-               </size>
-              </property>
-              <property name="frameShape">
-               <enum>QFrame::StyledPanel</enum>
-              </property>
-              <property name="frameShadow">
-               <enum>QFrame::Raised</enum>
-              </property>
-              <layout class="QHBoxLayout" name="horizontalLayout_3">
-               <item>
-                <widget class="QLabel" name="label_8">
-                 <property name="text">
-                  <string>Dates before</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QSpinBox" name="sb_ndates_before">
-                 <property name="maximum">
-                  <number>9999</number>
-                 </property>
-                 <property name="value">
-                  <number>1</number>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QLabel" name="label_9">
-                 <property name="text">
-                  <string>after</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QSpinBox" name="sb_ndates_after">
-                 <property name="maximum">
-                  <number>9999</number>
-                 </property>
-                 <property name="value">
-                  <number>1</number>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_3">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>40</width>
-                   <height>20</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-              </layout>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-         </item>
-        </layout>
-       </widget>
       </widget>
      </item>
      <item>
@@ -720,22 +678,5 @@
  <resources>
   <include location="resources.qrc"/>
  </resources>
- <connections>
-  <connection>
-   <sender>rb_showTimeWindow</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>frame_timewindow</receiver>
-   <slot>setEnabled(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>62</x>
-     <y>139</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>176</x>
-     <y>202</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
+ <connections/>
 </ui>
-- 
GitLab