Code

321b7899fc164114bef8dc9cd11513f21b7f7def
[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>
19 namespace Inkscape {
20 namespace UI {
23 PreviewHolder::PreviewHolder() :
24     VBox(),
25     PreviewFillable(),
26     _scroller(0),
27     _anchor(Gtk::ANCHOR_CENTER),
28     _baseSize(Gtk::ICON_SIZE_MENU),
29     _view(VIEW_TYPE_LIST)
30 {
31     _scroller = manage(new Gtk::ScrolledWindow());
32     Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
33     stuff->set_col_spacings( 8 );
34     _insides = stuff;
35     _scroller->add(*stuff);
37     pack_start(*_scroller, Gtk::PACK_EXPAND_WIDGET);
38 }
40 PreviewHolder::~PreviewHolder()
41 {
42 }
46 void PreviewHolder::clear()
47 {
48     items.clear();
49     rebuildUI();
50 }
52 void PreviewHolder::addPreview( Previewable* preview )
53 {
54     items.push_back(preview);
56     int i = items.size() - 1;
57     if ( _view == VIEW_TYPE_LIST ) {
58         Gtk::Widget* label = manage(preview->getPreview(PREVIEW_STYLE_BLURB, VIEW_TYPE_LIST, _baseSize));
59         Gtk::Widget* thing = manage(preview->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_LIST, _baseSize));
61         _insides->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
62         _insides->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
63     } else {
64         Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_GRID, _baseSize));
65         int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
66         int col = i % width;
67         int row = i / width;
68         if ( col == 0 ) {
69             // we just started a new row
70             _insides->resize( row + 1, width );
71         }
72         _insides->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
73     }
75     _scroller->show_all_children();
76     _scroller->queue_draw();
77 }
79 void PreviewHolder::setStyle(Gtk::BuiltinIconSize size, ViewType view)
80 {
81     if ( size != _baseSize || view != _view ) {
82         _baseSize = size;
83         _view = view;
84         rebuildUI();
85     }
86 }
88 void PreviewHolder::setOrientation( Gtk::AnchorType how )
89 {
90     if ( _anchor != how )
91     {
92         switch ( _anchor )
93         {
94             case Gtk::ANCHOR_NORTH:
95             case Gtk::ANCHOR_SOUTH:
96             {
97                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
98             }
99             break;
101             case Gtk::ANCHOR_EAST:
102             case Gtk::ANCHOR_WEST:
103             {
104                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC );
105             }
106             break;
108             default:
109             {
110                 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
111             }
112         }
113     }
116 void PreviewHolder::rebuildUI()
118     _scroller->remove();
120     if ( _view == VIEW_TYPE_LIST ) {
121         Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
122         _insides = stuff;
123         stuff->set_col_spacings( 8 );
125         for ( unsigned int i = 0; i < items.size(); i++ ) {
126             Gtk::Widget* label = manage(items[i]->getPreview(PREVIEW_STYLE_BLURB, _view, _baseSize));
127             //label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
129             Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
131             stuff->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
132             stuff->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
133         }
134         _scroller->add(*stuff);
135     } else {
136         int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
137         int height = (items.size() + (width - 1)) / width;
138         if ( height < 1 ) {
139             height = 1;
140         }
142         Gtk::Table* stuff = manage(new Gtk::Table( height, width ));
143         _insides = stuff;
144         int col = 0;
145         int row = 0;
147         for ( unsigned int i = 0; i < items.size(); i++ ) {
148             Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
150             stuff->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
151             col++;
152             if ( col >= width ) {
153                 col = 0;
154                 row++;
155             }
156         }
157         _scroller->add(*stuff);
158     }
160     _scroller->show_all_children();
161     _scroller->queue_draw();
168 } //namespace UI
169 } //namespace Inkscape
172 /*
173   Local Variables:
174   mode:c++
175   c-file-style:"stroustrup"
176   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
177   indent-tabs-mode:nil
178   fill-column:99
179   End:
180 */
181 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :