* Introduce a new tab to the Appearance Preflet for Decorator

* Show Decorator information button
* Decorator changes happen in real time on click
* Remove *old* OpenBeOS Decerator selection code
* Still have a little cleanup todo
* Need to give a little focus on revert/default buttons
* Decerator test / screenshots?


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42356 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Alexander von Gluck IV
2011-07-01 04:46:07 +00:00
parent fd47185941
commit 97510b0338
9 changed files with 325 additions and 318 deletions
+2 -27
View File
@@ -23,8 +23,6 @@
#include <Path.h>
#include <SpaceLayoutItem.h>
#include <DecorInfo.h>
#include "APRWindow.h"
#include "defs.h"
#include "ColorWell.h"
@@ -41,10 +39,8 @@
APRView::APRView(const char* name, uint32 flags)
:
BView(name, flags),
fDefaultSet(ColorSet::DefaultColorSet()),
fDecorMenu(NULL),
fDecorUtil(new DecorInfoUtility(false))
BView(name, flags),
fDefaultSet(ColorSet::DefaultColorSet())
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
@@ -126,9 +122,6 @@ APRView::AttachedToWindow()
fAttrList->SetTarget(this);
fColorWell->SetTarget(this);
if (fDecorMenu)
fDecorMenu->SetTargetForItems(BMessenger(this));
LoadSettings();
fAttrList->Select(0);
}
@@ -148,15 +141,6 @@ APRView::MessageReceived(BMessage *msg)
}
switch (msg->what) {
case DECORATOR_CHANGED:
{
int32 index = fDecorMenu->IndexOf(fDecorMenu->FindMarked());
#ifdef HAIKU_TARGET_PLATFORM_HAIKU
if (index >= 0)
fDecorUtil->SetDecorator(index);
#endif
break;
}
case UPDATE_COLOR:
{
// Received from the color fPicker when its color changes
@@ -199,15 +183,6 @@ APRView::MessageReceived(BMessage *msg)
UpdateControls();
UpdateAllColors();
if (fDecorMenu) {
BMenuItem *item = fDecorMenu->FindItem("Default");
if (item) {
item->SetMarked(true);
#ifdef HAIKU_TARGET_PLATFORM_HAIKU
fDecorUtil->SetDecorator(fDecorMenu->IndexOf(item));
#endif
}
}
Window()->PostMessage(kMsgUpdate);
break;
}
-3
View File
@@ -63,9 +63,6 @@ protected:
ColorSet fCurrentSet;
ColorSet fPrevSet;
ColorSet fDefaultSet;
BMenu *fDecorMenu;
DecorInfoUtility*fDecorUtil;
};
#endif
+15 -3
View File
@@ -1,10 +1,13 @@
/*
* Copyright 2002-2006, Haiku. All rights reserved.
* Copyright 2002-2011, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* DarkWyrm ([email protected])
* Alexander von Gluck, [email protected]
*/
#include "APRWindow.h"
#include <Button.h>
@@ -18,16 +21,19 @@
#include "APRView.h"
#include "defs.h"
#undef B_TRANSLATE_CONTEXT
#define B_TRANSLATE_CONTEXT "APRWindow"
static const uint32 kMsgSetDefaults = 'dflt';
static const uint32 kMsgRevert = 'rvrt';
APRWindow::APRWindow(BRect frame)
:
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("Appearance"), B_TITLED_WINDOW,
B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS, B_ALL_WORKSPACES)
B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS, B_ALL_WORKSPACES)
{
SetLayout(new BGroupLayout(B_HORIZONTAL));
@@ -42,13 +48,19 @@ APRWindow::APRWindow(BRect frame)
fAntialiasingSettings = new AntialiasingSettingsView(
B_TRANSLATE("Antialiasing"));
fDecorSettings = new DecorSettingsView(
B_TRANSLATE("Window Decorator"));
fColorsView = new APRView(B_TRANSLATE("Colors"), B_WILL_DRAW);
tabView->AddTab(fColorsView);
tabView->AddTab(fAntialiasingSettings);
tabView->AddTab(fDecorSettings);
fDefaultsButton->SetEnabled(fColorsView->IsDefaultable()
|| fAntialiasingSettings->IsDefaultable());
|| fAntialiasingSettings->IsDefaultable()
|| fDecorSettings->IsDefaultable());
fRevertButton->SetEnabled(false);
AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
+16 -11
View File
@@ -1,13 +1,15 @@
/*
* Copyright 2002-2006, Haiku. All rights reserved.
* Copyright 2002-2011, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* DarkWyrm ([email protected])
* Alexander von Gluck, [email protected]
*/
#ifndef APR_WINDOW_H
#define APR_WINDOW_H
#include <Application.h>
#include <Button.h>
#include <Window.h>
@@ -16,23 +18,26 @@
#include "APRView.h"
#include "AntialiasingSettingsView.h"
#include "DecorSettingsView.h"
class APRWindow : public BWindow
class APRWindow : public BWindow
{
public:
APRWindow(BRect frame);
bool QuitRequested(void);
void MessageReceived(BMessage *message);
APRWindow(BRect frame);
bool QuitRequested(void);
void MessageReceived(BMessage *message);
private:
APRView* fColorsView;
BButton* fDefaultsButton;
BButton* fRevertButton;
AntialiasingSettingsView* fAntialiasingSettings;
APRView* fColorsView;
BButton* fDefaultsButton;
BButton* fRevertButton;
AntialiasingSettingsView* fAntialiasingSettings;
DecorSettingsView* fDecorSettings;
};
static const int32 kMsgUpdate = 'updt';
#endif
-220
View File
@@ -1,220 +0,0 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: DecView.cpp
// Author: DarkWyrm <[email protected]>
// Description: decorator handler for the app
//
// Utilizes app_server graphics module emulation to allows decorators to display
// a preview. Saves the chosen decorator's path in a settings file in the app_server
// settings directory.
//------------------------------------------------------------------------------
#include <OS.h>
#include <Message.h>
#include <File.h>
#include <ScrollView.h>
#include <ListItem.h>
#include <stdio.h>
#include <Directory.h>
#include <Bitmap.h>
#include "ServerConfig.h"
#include "DecView.h"
#include "defs.h"
//#define DEBUG_DECORATOR
#ifdef DEBUG_DECORATOR
#define STRACE(a) printf a
#else
#define STRACE(a) /* nothing */
#endif
namespace BPrivate
{
int32 count_decorators(void);
status_t set_decorator(const int32 &index);
int32 get_decorator(void);
status_t get_decorator_name(const int32 &index, BString &name);
status_t get_decorator_preview(const int32 &index, BBitmap *bitmap);
}
class DecoratorItem : public BStringItem
{
public:
DecoratorItem(const char *text, const int32 &index);
int32 GetIndex(void) const { return fIndex; }
private:
int32 fIndex;
};
DecoratorItem::DecoratorItem(const char *text, const int32 &index)
: BStringItem(text),
fIndex(index)
{
}
DecView::DecView(BRect frame, const char *name, int32 resize, int32 flags)
:BView(frame,name,resize,flags)
{
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
BRect r;
r.left = r.top = 10;
r.right = Bounds().Width()/2 - 10;
r.bottom = Bounds().bottom * .75;
// TODO: This will eventually be just a BView which draws a BBitmap, but for now
// we will use a placeholder
preview = new BView(r, "preview", B_FOLLOW_NONE, B_WILL_DRAW);
preview->SetViewColor(100,140,255);
AddChild(preview);
r.left = r.right + 20;
r.right = Bounds().right - 10 - B_V_SCROLL_BAR_WIDTH;
declist = new BListView(r, "listview");
declist->SetSelectionMessage( new BMessage(DECORATOR_CHOSEN) );
BScrollView *scrollView = new BScrollView("scrollview", declist, B_FOLLOW_NONE,
0,false,true);
AddChild(scrollView);
apply = new BButton( BRect(0,0,1,1), "apply", "Apply", new BMessage(APPLY_SETTINGS),
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
apply->ResizeToPreferred();
apply->MoveTo( Bounds().Width() - 10 - apply->Bounds().Width(),
Bounds().Height() - 10 - apply->Bounds().Height() );
AddChild(apply);
// Now that we have all the controls in place, populate the list
int32 decCount = BPrivate::count_decorators();
for(int32 i=0; i<decCount; i++)
{
BString string;
if( BPrivate::get_decorator_name( i, string ) == B_OK )
declist->AddItem( new DecoratorItem( string.String(), i ) );
}
}
void DecView::AttachedToWindow(void)
{
declist->SetTarget(this);
apply->SetTarget(this);
int32 currentDec = BPrivate::get_decorator();
if(currentDec>=0)
declist->Select(currentDec);
}
void DecView::MessageReceived(BMessage *msg)
{
switch(msg->what)
{
case APPLY_SETTINGS:
{
SaveSettings();
int32 selection = declist->CurrentSelection();
if(selection >=0 )
BPrivate::set_decorator(selection);
break;
}
case DECORATOR_CHOSEN:
{
// TODO: update the preview here
break;
}
default:
BView::MessageReceived(msg);
break;
}
}
void DecView::SaveSettings(void)
{
BStringItem *item=(DecoratorItem*)declist->ItemAt(declist->CurrentSelection());
if(!item)
return;
BString path(SERVER_SETTINGS_DIR);
path+="decorator_settings";
STRACE(("%s\n",path.String()));
BFile file(path.String(),B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE);
BMessage settings;
settings.AddString("decorator",item->Text());
settings.Flatten(&file);
}
void DecView::LoadSettings(void)
{
BMessage settings;
BDirectory dir,newdir;
if(dir.SetTo(SERVER_SETTINGS_DIR)==B_ENTRY_NOT_FOUND)
create_directory(SERVER_SETTINGS_DIR,0777);
BString path(SERVER_SETTINGS_DIR);
path+="decorator_settings";
BFile file(path.String(),B_READ_ONLY);
if(file.InitCheck()!=B_OK)
{
STRACE(("Error opening settings file %s\n",path.String()));
return;
}
if(settings.Unflatten(&file)!=B_OK)
{
STRACE(("Error unflattening settings file %s\n",path.String()));
return;
}
BString itemtext;
if(settings.FindString("decorator",&itemtext)!=B_OK)
{
STRACE(("Couldn't find decorator name in settings file %s\n",path.String()));
return;
}
for(int32 i=0;i<declist->CountItems();i++)
{
BStringItem *item=(BStringItem*)declist->ItemAt(i);
if(item && itemtext.Compare(item->Text())==0)
{
declist->Select(i);
return;
}
}
}
-52
View File
@@ -1,52 +0,0 @@
//------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: DecView.h
// Author: DarkWyrm <[email protected]>
// Description: decorator handler for the app
//
//------------------------------------------------------------------------------
#ifndef DEC_VIEW_H_
#define DEC_VIEW_H_
#include <View.h>
#include <ListView.h>
#include <Button.h>
#include <String.h>
class DecView : public BView
{
public:
DecView(BRect frame, const char *name, int32 resize, int32 flags);
void AttachedToWindow(void);
void MessageReceived(BMessage *msg);
void SaveSettings(void);
void LoadSettings(void);
protected:
BButton *apply;
BListView *declist;
BView *preview;
};
#endif
@@ -0,0 +1,235 @@
/*
* Copyright 2010-2011 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* Alexander von Gluck, [email protected]
*/
#include "DecorSettingsView.h"
#include <stdio.h>
#include <stdlib.h>
#include <Alert.h>
#include <Box.h>
#include <Catalog.h>
#include <GridLayoutBuilder.h>
#include <GroupLayoutBuilder.h>
#include <Locale.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <PopUpMenu.h>
#include <Slider.h>
#include <SpaceLayoutItem.h>
#include <String.h>
#include <TextView.h>
#include "APRWindow.h"
#undef B_TRANSLATE_CONTEXT
#define B_TRANSLATE_CONTEXT "DecorSettingsView"
static const int32 kMsgSetDecor = 'deco';
static const int32 kMsgDecorInfo = 'idec';
// #pragma mark -
DecorSettingsView::DecorSettingsView(const char* name)
:
BView(name, 0)
{
// Decorator menu
_BuildDecorMenu();
fDecorMenuField = new BMenuField("decorator",
B_TRANSLATE("Window Decorator:"), fDecorMenu);
fDecorInfoButton = new BButton(B_TRANSLATE("About"),
new BMessage(kMsgDecorInfo));
SetLayout(new BGroupLayout(B_VERTICAL));
// control layout
AddChild(BGridLayoutBuilder(10, 10)
.Add(fDecorMenuField->CreateLabelLayoutItem(), 0, 0)
.Add(fDecorMenuField->CreateMenuBarLayoutItem(), 1, 0)
.Add(fDecorInfoButton, 2, 0)
.Add(BSpaceLayoutItem::CreateGlue(), 0, 3, 2)
.SetInsets(10, 10, 10, 10)
);
// TODO : Decorator Preview Image?
}
DecorSettingsView::~DecorSettingsView()
{
}
void
DecorSettingsView::AttachedToWindow()
{
if (Parent() != NULL)
SetViewColor(Parent()->ViewColor());
else
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fDecorMenu->SetTargetForItems(this);
fDecorInfoButton->SetTarget(this);
}
void
DecorSettingsView::MessageReceived(BMessage *msg)
{
switch (msg->what) {
case kMsgSetDecor:
{
BString newDecor;
if (msg->FindString("decor", &newDecor) != B_OK)
break;
DecorInfoUtility* decorUtility = new DecorInfoUtility();
if (decorUtility == NULL)
return;
DecorInfo* decor = decorUtility->FindDecorator(newDecor);
if (decor == NULL)
return;
fSavedDecor = fCurrentDecor;
fCurrentDecor = (char*)decor->Name().String();
decorUtility->SetDecorator(decor);
Window()->PostMessage(kMsgUpdate);
break;
}
case kMsgDecorInfo:
{
DecorInfoUtility* decorUtility = new DecorInfoUtility();
if (decorUtility == NULL)
return;
BString decoratorName(fCurrentDecor);
DecorInfo* decor = decorUtility->FindDecorator(decoratorName);
if (decor == NULL)
return;
BString authorsText(decor->Authors().String());
authorsText.ReplaceAll(", ", "\n ");
BString infoText("Name: %decorName\n"
"Authors:\n %decorAuthors\n"
"URL: %decorURL\n"
"License: %decorLic\n"
"Description:\n %decorDesc\n");
infoText.ReplaceFirst("%decorName", decor->Name().String());
infoText.ReplaceFirst("%decorAuthors", authorsText.String());
infoText.ReplaceFirst("%decorLic", decor->LicenseName().String());
infoText.ReplaceFirst("%decorURL", decor->SupportURL().String());
infoText.ReplaceFirst("%decorDesc", decor->ShortDescription().String());
BAlert *infoAlert = new BAlert(B_TRANSLATE("About Decerator"),
infoText.String(), B_TRANSLATE("OK"));
infoAlert->SetShortcut(0, B_ESCAPE);
infoAlert->Go();
Window()->PostMessage(kMsgUpdate);
break;
}
default:
BView::MessageReceived(msg);
}
}
void
DecorSettingsView::_BuildDecorMenu()
{
fDecorMenu = new BPopUpMenu(B_TRANSLATE("Choose Decorator"));
DecorInfo* decorator = NULL;
// collect the current system decor settings
DecorInfoUtility* decorUtility = new DecorInfoUtility();
if (decorUtility == NULL) {
return;
}
int32 count = decorUtility->CountDecorators();
for (int32 i = 0; i < count; ++i) {
decorator = decorUtility->DecoratorAt(i);
if (decorator == NULL) {
fprintf(stderr, "Decorator : error NULL entry @ %li / %li\n",
i, count);
}
BString decorName = decorator->Name();
if (decorUtility->CurrentDecorator() == decorator)
fCurrentDecor = (char*)decorName.String();
BMessage* message = new BMessage(kMsgSetDecor);
message->AddString("decor", decorator->Name());
BMenuItem* item
= new BMenuItem(decorator->Name(), message);
fDecorMenu->AddItem(item);
}
_SetCurrentDecor();
}
void
DecorSettingsView::_SetCurrentDecor()
{
BMenuItem *item = fDecorMenu->FindItem(fCurrentDecor);
BString currDecor = fCurrentDecor;
if (item != NULL)
item->SetMarked(true);
}
void
DecorSettingsView::SetDefaults()
{
DecorInfoUtility* decorUtility = new DecorInfoUtility();
if (decorUtility == NULL)
return;
DecorInfo* defaultDecorator(decorUtility->DefaultDecorator());
decorUtility->SetDecorator(defaultDecorator);
_BuildDecorMenu();
}
bool
DecorSettingsView::IsDefaultable()
{
return true;
}
bool
DecorSettingsView::IsRevertable()
{
return fCurrentDecor != fSavedDecor;
}
void
DecorSettingsView::Revert()
{
if (!IsRevertable())
return;
}
@@ -0,0 +1,54 @@
/*
* Copyright 2010-2011 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* Alexander von Gluck, kallisti5@unixzen.com
*/
#ifndef DECOR_SETTINGS_VIEW_H
#define DECOR_SETTINGS_VIEW_H
#include <Button.h>
#include <GroupView.h>
#include <InterfaceDefs.h>
#include <View.h>
#include <DecorInfo.h>
class BBox;
class BMenuField;
class BPopUpMenu;
class DecorSettingsView : public BView {
public:
DecorSettingsView(const char* name);
virtual ~DecorSettingsView();
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
void SetDefaults();
void Revert();
bool IsDefaultable();
bool IsRevertable();
private:
void _BuildDecorMenu();
void _SetCurrentDecor();
BButton* fDecorInfoButton;
protected:
float fDivider;
BMenuField* fDecorMenuField;
BPopUpMenu* fDecorMenu;
char* fSavedDecor;
char* fCurrentDecor;
};
#endif // DECOR_SETTINGS_VIEW_H
+3 -2
View File
@@ -6,6 +6,7 @@ UseFreeTypeHeaders ;
Preference Appearance :
APRMain.cpp
AntialiasingSettingsView.cpp
DecorSettingsView.cpp
APRView.cpp
APRWindow.cpp
ColorSet.cpp
@@ -15,14 +16,13 @@ Preference Appearance :
# These are currently disabled while everything else is being worked on
#CurView.cpp
#CursorWhichItem.cpp
#DecView.cpp
#SysCursorAPI.cpp
# These exist for post-R1, so they are disabled for now
#FontMenu.cpp
#MenuView.cpp
: be $(TARGET_LIBSTDC++) $(HAIKU_LOCALE_LIBS)
: be $(TARGET_LIBSTDC++) $(TARGET_LIBSUPC++) $(HAIKU_LOCALE_LIBS)
: Appearance.rdef
;
@@ -30,6 +30,7 @@ DoCatalogs Appearance :
x-vnd.Haiku-Appearance
:
AntialiasingSettingsView.cpp
DecorSettingsView.cpp
APRView.cpp
APRWindow.cpp
ColorSet.cpp