Improved folder config window a bit.

* Now uses the BLayoutBuilder instead of ALM layout - not only is the code much
  simpler now, resizing the window isn't as sluggish anymore (less flickering).
* Fixed a drawing bug in the list view; the drawing state wasn't properly
  maintained, leading to rendering artefacts.
* Moved the checkbox to the start of the line.
* Use B_ASYNCHRONOUS_CONTROLS for all windows.
* Fixed a few typos.
This commit is contained in:
Axel Dörfler
2015-01-06 15:20:58 +01:00
parent cc3aa99cb3
commit 3e4e5c2cf6
3 changed files with 65 additions and 63 deletions
@@ -7,14 +7,15 @@
#include "FolderConfigWindow.h"
#include <Button.h>
#include <Catalog.h>
#include <ControlLook.h>
#include <LayoutBuilder.h>
#include <ListItem.h>
#include <ScrollView.h>
#include <SpaceLayoutItem.h>
#include <StringView.h>
#include <ALMLayout.h>
#include <ALMGroup.h>
#include <StringForSize.h>
#include "Settings.h"
@@ -77,28 +78,17 @@ private:
class StatusWindow : public BWindow {
public:
StatusWindow(const char* text)
StatusWindow(BWindow* parent, const char* text)
:
BWindow(BRect(0, 0, 10, 10), B_TRANSLATE("status"), B_MODAL_WINDOW_LOOK,
B_MODAL_APP_WINDOW_FEEL, B_NO_WORKSPACE_ACTIVATION | B_NOT_ZOOMABLE
| B_AVOID_FRONT | B_NOT_RESIZABLE)
| B_AVOID_FRONT | B_NOT_RESIZABLE | B_NOT_ZOOMABLE
| B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS)
{
BView* rootView = new BView(Bounds(), "root", B_FOLLOW_ALL,
B_WILL_DRAW);
AddChild(rootView);
rootView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
BALMLayout* layout = new BALMLayout(B_USE_ITEM_SPACING,
B_USE_ITEM_SPACING);
rootView->SetLayout(layout);
layout->SetInsets(B_USE_WINDOW_SPACING);
BStringView* string = new BStringView("text", text);
layout->AddView(string, layout->Left(), layout->Top(), layout->Right(),
layout->Bottom());
BSize min = layout->MinSize();
ResizeTo(min.Width(), min.Height());
CenterOnScreen();
BLayoutBuilder::Group<>(this)
.SetInsets(B_USE_DEFAULT_SPACING)
.Add(new BStringView("text", text));
CenterIn(parent->Frame());
}
};
@@ -127,35 +117,50 @@ CheckBoxItem::CheckBoxItem(const char* text, bool checked)
fChecked(checked),
fMouseDown(false)
{
}
void
CheckBoxItem::DrawItem(BView* owner, BRect itemRect, bool drawEverything)
{
BStringItem::DrawItem(owner, itemRect, drawEverything);
if (!be_control_look)
return;
rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
rgb_color lowColor = owner->LowColor();
uint32 flags = 0;
if (fMouseDown)
flags |= BControlLook::B_CLICKED;
if (fChecked)
flags |= BControlLook::B_ACTIVATED;
font_height fontHeight;
owner->GetFontHeight(&fontHeight);
BRect boxRect(0.0f, 2.0f, ceilf(3.0f + fontHeight.ascent),
ceilf(5.0f + fontHeight.ascent));
fBoxRect.left = itemRect.right - boxRect.Width();
owner->PushState();
float left = itemRect.left;
fBoxRect.left = left + 3;
fBoxRect.top = itemRect.top + (itemRect.Height() - boxRect.Height()) / 2;
fBoxRect.right = itemRect.right;
fBoxRect.right = fBoxRect.left + boxRect.Width();
fBoxRect.bottom = itemRect.top + boxRect.Height();
itemRect.left = fBoxRect.right + be_control_look->DefaultLabelSpacing();
if (IsSelected() || drawEverything) {
if (IsSelected()) {
owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT));
owner->SetLowColor(owner->HighColor());
} else
owner->SetHighColor(lowColor);
owner->FillRect(
BRect(left, itemRect.top, itemRect.left, itemRect.bottom));
}
be_control_look->DrawCheckBox(owner, fBoxRect, fBoxRect, base, flags);
owner->PopState();
BStringItem::DrawItem(owner, itemRect, drawEverything);
}
@@ -247,40 +252,36 @@ EditListView::FrameResized(float newWidth, float newHeight)
FolderConfigWindow::FolderConfigWindow(BRect parent, const BMessage& settings)
:
BWindow(BRect(0, 0, 300, 300), B_TRANSLATE("IMAP Folders"),
BWindow(BRect(0, 0, 350, 350), B_TRANSLATE("IMAP Folders"),
B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
B_NO_WORKSPACE_ACTIVATION | B_NOT_ZOOMABLE | B_AVOID_FRONT),
B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
fSettings(settings)
{
BView* rootView = new BView(Bounds(), "root", B_FOLLOW_ALL, B_WILL_DRAW);
AddChild(rootView);
rootView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
BALMLayout* layout = new BALMLayout(B_USE_ITEM_SPACING, B_USE_ITEM_SPACING);
rootView->SetLayout(layout);
layout->SetInsets(B_USE_WINDOW_INSETS);
fFolderListView = new EditListView(B_TRANSLATE("IMAP Folders"));
fFolderListView->SetExplicitPreferredSize(BSize(B_SIZE_UNLIMITED,
B_SIZE_UNLIMITED));
fApplyButton = new BButton("Apply", B_TRANSLATE("Apply"),
new BMessage(kMsgApplyButton));
fQuotaView = new BStringView("quota view",
B_TRANSLATE("Failed to fetch available storage."));
fQuotaView->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT,
B_ALIGN_VERTICAL_CENTER));
fQuotaView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
(ALMGroup(fQuotaView) / ALMGroup(fFolderListView)
/ (ALMGroup(BSpaceLayoutItem::CreateGlue())
| ALMGroup(fApplyButton))).BuildLayout(layout);
fFolderListView = new EditListView(B_TRANSLATE("IMAP Folders"));
fFolderListView->SetExplicitPreferredSize(BSize(B_SIZE_UNLIMITED,
B_SIZE_UNLIMITED));
BButton* cancelButton = new BButton("cancel", B_TRANSLATE("Cancel"),
new BMessage(B_QUIT_REQUESTED));
BButton* applyButton = new BButton("apply", B_TRANSLATE("Apply"),
new BMessage(kMsgApplyButton));
BLayoutBuilder::Group<>(this, B_VERTICAL)
.SetInsets(B_USE_DEFAULT_SPACING)
.Add(fQuotaView)
.Add(new BScrollView("scroller", fFolderListView, 0, false, true))
.AddGroup(B_HORIZONTAL)
.AddGlue()
.Add(cancelButton)
.Add(applyButton);
PostMessage(kMsgInit);
BSize min = layout->MinSize();
BSize max = layout->MaxSize();
SetSizeLimits(min.Width(), max.Width(), min.Height(), max.Height());
CenterIn(parent);
}
@@ -307,12 +308,15 @@ FolderConfigWindow::MessageReceived(BMessage* message)
void
FolderConfigWindow::_LoadFolders()
{
StatusWindow* status = new StatusWindow(
StatusWindow* statusWindow = new StatusWindow(this,
B_TRANSLATE("Fetching IMAP folders, have patience..."));
status->Show();
statusWindow->Show();
fProtocol.Connect(fSettings.ServerAddress(), fSettings.Username(),
fSettings.Password(), fSettings.UseSSL());
status_t status = fProtocol.Connect(fSettings.ServerAddress(),
fSettings.Username(), fSettings.Password(), fSettings.UseSSL());
if (status != B_OK) {
// TODO: show error message
}
// TODO: don't get all of them at once, but retrieve them level by level
fFolderList.clear();
@@ -335,7 +339,7 @@ FolderConfigWindow::_LoadFolders()
fQuotaView->SetText(quotaString);
}
status->PostMessage(B_QUIT_REQUESTED);
statusWindow->PostMessage(B_QUIT_REQUESTED);
}
@@ -354,8 +358,8 @@ FolderConfigWindow::_ApplyChanges()
if (!haveChanges)
return;
StatusWindow* status = new StatusWindow(B_TRANSLATE("Subcribe / Unsuscribe "
"IMAP folders, have patience..."));
StatusWindow* status = new StatusWindow(this,
B_TRANSLATE("Update subcription of IMAP folders, have patience..."));
status->Show();
for (size_t i = 0; i < fFolderList.size(); i++) {
@@ -7,7 +7,6 @@
#define FOLDER_CONFIG_WINDOW_H
#include <Button.h>
#include <ListView.h>
#include <StringView.h>
#include <Window.h>
@@ -32,11 +31,10 @@ private:
private:
const Settings fSettings;
IMAP::Protocol fProtocol;
BListView* fFolderListView;
BButton* fApplyButton;
IMAP::FolderList fFolderList;
BStringView* fQuotaView;
BListView* fFolderListView;
};
@@ -43,7 +43,7 @@ Addon IMAP
$(sources)
:
be libmail.so localestub $(TARGET_NETWORK_LIBS) libbnetapi.so
libalm.so libshared.a [ TargetLibsupc++ ] [ TargetLibstdc++ ]
libshared.a [ TargetLibsupc++ ] [ TargetLibstdc++ ]
;
SEARCH on [ FGristFiles Commands.cpp Protocol.cpp Response.cpp ]