Code

make sure only positive dialog positions are read from preferences, fixes #1290647
[inkscape.git] / src / ui / previewholder.cpp
2 /*
3  * A simple interface for previewing representations.
4  *
5  * Authors:
6  *   Jon A. Cruz
7  *
8  * Copyright (C) 2005 Jon A. Cruz
9  *
10  * Released under GNU GPL, read the file 'COPYING' for more information
11  */
14 #include "previewholder.h"
16 #include <gtkmm/scrolledwindow.h>
17 #include <gtkmm/sizegroup.h>
18 #include <gtkmm/scrollbar.h>
21 namespace Inkscape {
22 namespace UI {
25 PreviewHolder::PreviewHolder() :
26     VBox(),
27     PreviewFillable(),
28     _scroller(0),
29     _zee0(0),
30     _zee1(0),
31     _zee2(0),
32     _anchor(Gtk::ANCHOR_CENTER),
33     _baseSize(Gtk::ICON_SIZE_MENU),
34     _view(VIEW_TYPE_LIST)
35 {
36     _scroller = manage(new Gtk::ScrolledWindow());
37     Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
38     stuff->set_col_spacings( 8 );
39     _insides = stuff;
41     // Add a container with the scroller and a spacer
42     Gtk::Table* spaceHolder = manage( new Gtk::Table(1, 2) );
43     _zee0 = manage( new Gtk::VBox() );
44     _scroller->add(*stuff);
45     spaceHolder->attach( *_scroller, 0, 1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
46     spaceHolder->attach( *_zee0, 1, 2, 0, 1, Gtk::SHRINK, Gtk::FILL|Gtk::EXPAND );
48     pack_start(*spaceHolder, Gtk::PACK_EXPAND_WIDGET);
49 }
51 PreviewHolder::~PreviewHolder()
52 {
53 }
57 void PreviewHolder::clear()
58 {
59     items.clear();
60     rebuildUI();
61 }
63 void PreviewHolder::addPreview( Previewable* preview )
64 {
65     items.push_back(preview);
67     int i = items.size() - 1;
68     if ( _view == VIEW_TYPE_LIST ) {
69         Gtk::Widget* label = manage(preview->getPreview(PREVIEW_STYLE_BLURB, VIEW_TYPE_LIST, _baseSize));
70         Gtk::Widget* thing = manage(preview->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_LIST, _baseSize));
72         _insides->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
73         _insides->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
74     } else {
75         Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_GRID, _baseSize));
76         int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
77         int col = i % width;
78         int row = i / width;
79         if ( col == 0 ) {
80             // we just started a new row
81             _insides->resize( row + 1, width );
82         }
83         _insides->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
84     }
86     _scroller->show_all_children();
87     _scroller->queue_draw();
88 }
90 void PreviewHolder::setStyle(Gtk::BuiltinIconSize size, ViewType view)
91 {
92     if ( size != _baseSize || view != _view ) {
93         _baseSize = size;
94         _view = view;
95         rebuildUI();
96     }
97 }
99 void PreviewHolder::setOrientation( Gtk::AnchorType how )
101     if ( _anchor != how )
102     {
103         _anchor = how;
104         switch ( _anchor )
105         {
106             case Gtk::ANCHOR_NORTH:
107             case Gtk::ANCHOR_SOUTH:
108             {
109                 //dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
110                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC );
111                 if ( !_zee1 )
112                 {
113                     _zee1 = manage( new Gtk::VBox() );
114                     _zee2 = manage( new Gtk::VBox() );
116                     // Trick to get the scrolled window to a minimum height larger than the scrollbar
118                     Gtk::VScrollbar* vs = dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->get_vscrollbar(); 
119                     // TODO fix leakage
120                     Glib::RefPtr<Gtk::SizeGroup> sizer = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_VERTICAL);
121                     sizer->add_widget( *_zee1 );
122                     sizer->add_widget( *_zee2 );
123                     sizer->add_widget( *vs );
125                     _zee0->pack_start( *_zee1 );
126                     _zee0->pack_start( *_zee2 );
127                 }
128             }
129             break;
131             case Gtk::ANCHOR_EAST:
132             case Gtk::ANCHOR_WEST:
133             {
134                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC );
135             }
136             break;
138             default:
139             {
140                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
141             }
142         }
143     }
146 void PreviewHolder::rebuildUI()
148     _scroller->remove();
150     if ( _view == VIEW_TYPE_LIST ) {
151         Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
152         _insides = stuff;
153         stuff->set_col_spacings( 8 );
155         for ( unsigned int i = 0; i < items.size(); i++ ) {
156             Gtk::Widget* label = manage(items[i]->getPreview(PREVIEW_STYLE_BLURB, _view, _baseSize));
157             //label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
159             Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
161             stuff->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
162             stuff->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
163         }
164         _scroller->add(*stuff);
165     } else {
166         int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
167         int height = (items.size() + (width - 1)) / width;
168         if ( height < 1 ) {
169             height = 1;
170         }
172         Gtk::Table* stuff = manage(new Gtk::Table( height, width ));
173         _insides = stuff;
174         int col = 0;
175         int row = 0;
177         for ( unsigned int i = 0; i < items.size(); i++ ) {
178             Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
180             stuff->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
181             col++;
182             if ( col >= width ) {
183                 col = 0;
184                 row++;
185             }
186         }
187         _scroller->add(*stuff);
188     }
190     _scroller->show_all_children();
191     _scroller->queue_draw();
198 } //namespace UI
199 } //namespace Inkscape
202 /*
203   Local Variables:
204   mode:c++
205   c-file-style:"stroustrup"
206   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
207   indent-tabs-mode:nil
208   fill-column:99
209   End:
210 */
211 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :