2015-11-02 06:44:23 +08:00
|
|
|
// Copyright 2015 The Tops'l Authors
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the license at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package views
|
|
|
|
|
|
|
|
// Panel is a modified Layout that includes a primary content pane,
|
|
|
|
// prefixed with an optional title, and an optional menubar, and then
|
|
|
|
// suffixed by an optional status.
|
|
|
|
//
|
|
|
|
// Only the content pane is resizable. The panel will be formatted
|
|
|
|
// like this:
|
|
|
|
//
|
2022-09-01 02:37:42 +08:00
|
|
|
// +----------
|
|
|
|
// | title
|
|
|
|
// | menu
|
|
|
|
// | content....
|
|
|
|
// | <padding>
|
|
|
|
// | status
|
|
|
|
// +----------
|
2015-11-02 06:44:23 +08:00
|
|
|
//
|
|
|
|
// Each of these components may be any valid widget; their names are
|
|
|
|
// only meant to be indicative of conventional use, not prescriptive.
|
|
|
|
type Panel struct {
|
|
|
|
title Widget
|
|
|
|
menu Widget
|
|
|
|
content Widget
|
|
|
|
status Widget
|
|
|
|
inited bool
|
|
|
|
BoxLayout
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// Draw draws the Panel.
|
2015-11-02 06:44:23 +08:00
|
|
|
func (p *Panel) Draw() {
|
|
|
|
p.BoxLayout.SetOrientation(Vertical)
|
|
|
|
p.BoxLayout.Draw()
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// SetTitle sets the Widget to display in the title area.
|
2015-11-02 06:44:23 +08:00
|
|
|
func (p *Panel) SetTitle(w Widget) {
|
|
|
|
if p.title != nil {
|
|
|
|
p.RemoveWidget(p.title)
|
|
|
|
}
|
|
|
|
p.InsertWidget(0, w, 0.0)
|
|
|
|
p.title = w
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// SetMenu sets the Widget to display in the menu area, which is
|
|
|
|
// just below the title.
|
2015-11-02 06:44:23 +08:00
|
|
|
func (p *Panel) SetMenu(w Widget) {
|
|
|
|
index := 0
|
|
|
|
if p.title != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.menu != nil {
|
|
|
|
p.RemoveWidget(p.menu)
|
|
|
|
}
|
|
|
|
p.InsertWidget(index, w, 0.0)
|
|
|
|
p.menu = w
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// SetContent sets the Widget to display in the content area.
|
2015-11-02 06:44:23 +08:00
|
|
|
func (p *Panel) SetContent(w Widget) {
|
|
|
|
index := 0
|
|
|
|
if p.title != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.menu != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.content != nil {
|
|
|
|
p.RemoveWidget(p.content)
|
|
|
|
}
|
|
|
|
p.InsertWidget(index, w, 1.0)
|
|
|
|
p.content = w
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// SetStatus sets the Widget to display in the status area, which is at
|
|
|
|
// the bottom of the panel.
|
2015-11-02 06:44:23 +08:00
|
|
|
func (p *Panel) SetStatus(w Widget) {
|
|
|
|
index := 0
|
|
|
|
if p.title != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.menu != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.content != nil {
|
|
|
|
index++
|
|
|
|
}
|
|
|
|
if p.status != nil {
|
|
|
|
p.RemoveWidget(p.status)
|
|
|
|
}
|
|
|
|
p.InsertWidget(index, w, 0.0)
|
|
|
|
p.status = w
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
// NewPanel creates a new Panel. A zero valued panel can be created too.
|
2015-11-02 06:44:23 +08:00
|
|
|
func NewPanel() *Panel {
|
|
|
|
return &Panel{}
|
|
|
|
}
|