Code

NR::Maybe => boost::optional
[inkscape.git] / src / ui / previewholder.cpp
index 764890395666806055162cfb3233467c79ab5ac3..ba0b6a7efa31f9aa822b0c17bf2cc1d062d85c1a 100644 (file)
@@ -36,6 +36,7 @@ PreviewHolder::PreviewHolder() :
     _updatesFrozen(false),
     _anchor(Gtk::ANCHOR_CENTER),
     _baseSize(PREVIEW_SIZE_SMALL),
+    _ratio(100),
     _view(VIEW_TYPE_LIST),
     _wrap(false)
 {
@@ -61,6 +62,10 @@ void PreviewHolder::clear()
 {
     items.clear();
     _prefCols = 0;
+    // Kludge to restore scrollbars
+    if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+        dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
+    }
     rebuildUI();
 }
 
@@ -72,13 +77,13 @@ void PreviewHolder::addPreview( Previewable* preview )
         int i = items.size() - 1;
 
         if ( _view == VIEW_TYPE_LIST ) {
-            Gtk::Widget* label = manage(preview->getPreview(PREVIEW_STYLE_BLURB, VIEW_TYPE_LIST, _baseSize));
-            Gtk::Widget* thing = manage(preview->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_LIST, _baseSize));
+            Gtk::Widget* label = manage(preview->getPreview(PREVIEW_STYLE_BLURB, VIEW_TYPE_LIST, _baseSize, _ratio));
+            Gtk::Widget* thing = manage(preview->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_LIST, _baseSize, _ratio));
 
             _insides->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
             _insides->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
         } else {
-            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_GRID, _baseSize));
+            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_GRID, _baseSize, _ratio));
 
             int width = 1;
             int height = 1;
@@ -124,11 +129,16 @@ void PreviewHolder::thawUpdates()
     rebuildUI();
 }
 
-void PreviewHolder::setStyle( ::PreviewSize size, ViewType view )
+void PreviewHolder::setStyle( ::PreviewSize size, ViewType view, guint ratio )
 {
-    if ( size != _baseSize || view != _view ) {
+    if ( size != _baseSize || view != _view || ratio != _ratio ) {
         _baseSize = size;
         _view = view;
+        _ratio = ratio;
+        // Kludge to restore scrollbars
+        if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+            dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
+        }
         rebuildUI();
     }
 }
@@ -195,6 +205,18 @@ void PreviewHolder::on_size_allocate( Gtk::Allocation& allocation )
 //     g_message( "on_size_allocate(%d, %d) (%d, %d)", allocation.get_x(), allocation.get_y(), allocation.get_width(), allocation.get_height() );
 //     g_message("            anchor:%d", _anchor);
     Gtk::VBox::on_size_allocate( allocation );
+
+    if ( _insides && !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+        Gtk::Requisition req;
+        _insides->size_request(req);
+        gint delta = allocation.get_width() - req.width;
+
+        if ( (delta > 4) && req.height < allocation.get_height() ) {
+            dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_NEVER );
+        } else {
+            dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
+        }
+    }
 }
 
 void PreviewHolder::on_size_request( Gtk::Requisition* requisition )
@@ -259,10 +281,10 @@ void PreviewHolder::rebuildUI()
         _insides->set_col_spacings( 8 );
 
         for ( unsigned int i = 0; i < items.size(); i++ ) {
-            Gtk::Widget* label = manage(items[i]->getPreview(PREVIEW_STYLE_BLURB, _view, _baseSize));
+            Gtk::Widget* label = manage(items[i]->getPreview(PREVIEW_STYLE_BLURB, _view, _baseSize, _ratio));
             //label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
 
-            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
+            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize, _ratio));
 
             _insides->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
             _insides->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
@@ -275,7 +297,7 @@ void PreviewHolder::rebuildUI()
         int height = 1;
 
         for ( unsigned int i = 0; i < items.size(); i++ ) {
-            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
+            Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize, _ratio));
 
             if ( !_insides ) {
                 calcGridSize( thing, items.size(), width, height );