genode/repos/demo/src/app/scout/browser_window.h

163 lines
4.3 KiB
C++

/*
* \brief Browser window interface
* \date 2005-10-24
* \author Norman Feske <norman.feske@genode-labs.com>
*/
/*
* Copyright (C) 2005-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _BROWSER_WINDOW_H_
#define _BROWSER_WINDOW_H_
#include <scout/platform.h>
#include <scout/window.h>
#include "elements.h"
#include "widgets.h"
#include "sky_texture.h"
#include "refracted_icon.h"
#include "scrollbar.h"
#include "browser.h"
#include "titlebar.h"
namespace Scout { template <typename PT> class Browser_window; }
template <typename PT>
class Scout::Browser_window : public Scrollbar_listener,
public Browser,
public Window
{
enum {
ICON_HOME = 0,
ICON_BACKWARD = 1,
ICON_FORWARD = 2,
ICON_INDEX = 3,
ICON_ABOUT = 4
};
private:
/**
* Constants
*/
enum {
_NUM_ICONS = 5, /* number of icons */
_IW = 64, /* browser icon width */
_IH = 64, /* browser icon height */
_TH = 32, /* height of title bar */
_PANEL_W = 320, /* panel tile width */
_PANEL_H = _IH, /* panel tile height */
_SB_XPAD = 5, /* hor. pad of scrollbar */
_SB_YPAD = 10, /* vert. pad of scrollbar */
_SCRATCH = 7 /* scratching factor */
};
/**
* General properties
*/
Config const &_config;
int _attr = _config.browser_attr; /* attribute mask */
/**
* Remember graphics backend used as texture allocator
*/
Graphics_backend &_gfx_backend;
/**
* Widgets
*/
Titlebar<PT> _titlebar { };
Sky_texture<PT, 512, 512> _texture { _config.background_detail };
PT _icon_fg [_NUM_ICONS][_IH][_IW];
unsigned char _icon_fg_alpha [_NUM_ICONS][_IH][_IW];
Refracted_icon<PT, short> _icon [_NUM_ICONS];
PT _icon_backbuf [_IH*2][_IW*2];
PT _panel_fg [_PANEL_H][_PANEL_W];
unsigned char _panel_fg_alpha [_PANEL_H][_PANEL_W];
short _panel_distmap [_PANEL_H*2][_PANEL_W*2];
Refracted_icon<PT, short> _panel { };
PT _panel_backbuf [_PANEL_H*2][_PANEL_W*2];
Horizontal_shadow<PT, 160> _shadow { };
Scrollbar<PT> _scrollbar { };
Fade_icon<PT, _IW, _IH> _glow_icon[_NUM_ICONS];
Docview _docview { };
Fade_icon<PT, 32, 32> _sizer { };
protected:
/**
* Browser interface
*/
void _content(Element *content) override;
Element *_content() override;
public:
/**
* Browser window attributes
*/
enum {
ATTR_SIZER = 0x1, /* browser window has resize handle */
ATTR_TITLEBAR = 0x2, /* browser window has titlebar */
ATTR_BORDER = 0x4, /* draw black outline around browser */
};
/**
* Constructor
*/
Browser_window(Document *content, Graphics_backend &gfx_backend,
Point position, Area size, Area max_size,
Config const &config);
/**
* Return visible document offset
*/
inline int doc_offset() { return 10 + _IH + (_attr & ATTR_TITLEBAR ? _TH : 0); }
/**
* Define vertical scroll offset of document
*
* \param update_scrollbar if set to one, adjust scrollbar properties
* to the new view position.
*/
void ypos_sb(int ypos, int update_scrollbar = 1);
/**
* Browser interface
*/
void format(Area) override;
void ypos(int ypos) override { ypos_sb(ypos, 1); }
Anchor *curr_anchor() override;
Browser *browser() { return this; }
/**
* Element interface
*/
void draw(Canvas_base &canvas, Point abs_position) override
{
Parent_element::draw(canvas, abs_position);
if (_attr & ATTR_BORDER) {
Color color(0, 0, 0);
canvas.draw_box(0, 0, _size.w(), 1, color);
canvas.draw_box(0, _size.h() - 1, _size.w(), 1, color);
canvas.draw_box(0, 1, 1, _size.h() - 2, color);
canvas.draw_box(_size.w() - 1, 1, 1, _size.h() - 2, color);
}
};
/**
* Scrollbar listener interface
*/
void handle_scroll(int view_pos) override;
};
#endif /* _BROWSER_WINDOW_H_ */