Ticket #13884: 0006-magnify-make-it-controllable-by-scripting.patch

File 0006-magnify-make-it-controllable-by-scripting.patch, 5.9 KB (added by owenca, 7 years ago)
  • src/apps/magnify/Magnify.cpp

    From c6692f6cfeb81f4d1c80bd1db7cd18afd5e6df14 Mon Sep 17 00:00:00 2001
    From: Owen <owenca@users.noreply.github.com>
    Date: Tue, 19 Dec 2017 10:37:54 +0000
    Subject: [PATCH 6/6] magnify: make it controllable by scripting
    
    scripting properties:
    * show/hid info and grid
    * stick/unstick coordinates
    * copy image
    * make view square
    * set/get zoom factor
    
    fixes #13884
    ---
     src/apps/magnify/Magnify.cpp | 179 ++++++++++++++++++++++++++++++++++++++-----
     src/apps/magnify/Magnify.h   |   5 ++
     2 files changed, 166 insertions(+), 18 deletions(-)
    
    diff --git a/src/apps/magnify/Magnify.cpp b/src/apps/magnify/Magnify.cpp
    index 02d7c4a..0d03bea 100644
    a b  
    2626#include <NodeInfo.h>
    2727#include <Path.h>
    2828#include <PopUpMenu.h>
     29#include <PropertyInfo.h>
    2930#include <Screen.h>
    3031#include <ScrollView.h>
    3132#include <TextView.h>
    const int32 kDefaultPixelSize = 8;  
    9899const int32 kBorderSize = 10;
    99100
    100101
     102static property_info sProperties[] = {
     103    { "ShowInfo", { B_EXECUTE_PROPERTY, 0 },
     104        { B_DIRECT_SPECIFIER, 0 },
     105        "Show info.", 0,
     106    },
     107    { "HideInfo", { B_EXECUTE_PROPERTY, 0 },
     108        { B_DIRECT_SPECIFIER, 0 },
     109        "Hide info.", 0,
     110    },
     111    { "ShowGrid", { B_EXECUTE_PROPERTY, 0 },
     112        { B_DIRECT_SPECIFIER, 0 },
     113        "Show grid.", 0,
     114    },
     115    { "HideGrid", { B_EXECUTE_PROPERTY, 0 },
     116        { B_DIRECT_SPECIFIER, 0 },
     117        "Hide grid.", 0,
     118    },
     119    { "MakeSquare", { B_EXECUTE_PROPERTY, 0 },
     120        { B_DIRECT_SPECIFIER, 0 },
     121        "Make the view square.", 0,
     122    },
     123    { "Zoom", { B_GET_PROPERTY, B_SET_PROPERTY, 0 },
     124        { B_DIRECT_SPECIFIER, 0 },
     125        "Gets/sets the zoom factor (1-16).", 0,
     126        { B_INT32_TYPE }
     127    },
     128    { "Stick", { B_EXECUTE_PROPERTY, 0 },
     129        { B_DIRECT_SPECIFIER, 0 },
     130        "Stick coordinates.", 0,
     131    },
     132    { "Unstick", { B_EXECUTE_PROPERTY, 0 },
     133        { B_DIRECT_SPECIFIER, 0 },
     134        "Unstick coordinates.", 0,
     135    },
     136    { "CopyImage", { B_EXECUTE_PROPERTY, 0 },
     137        { B_DIRECT_SPECIFIER, 0 },
     138        "Copy image.", 0,
     139    },
     140
     141    { 0 }
     142};
     143
     144
    101145static float
    102146FontHeight(BView* target, bool full)
    103147{
    TWindow::~TWindow()  
    304348}
    305349
    306350
     351status_t
     352TWindow::GetSupportedSuites(BMessage* msg)
     353{
     354    msg->AddString("suites", "suite/x-vnd.Haiku-Magnify");
     355
     356    BPropertyInfo propertyInfo(sProperties);
     357    msg->AddFlat("messages", &propertyInfo);
     358
     359    return BHandler::GetSupportedSuites(msg);
     360}
     361
     362
     363BHandler*
     364TWindow::ResolveSpecifier(BMessage* msg, int32 index, BMessage* specifier,
     365    int32 what, const char* property)
     366{
     367    BPropertyInfo propertyInfo(sProperties);
     368    if (propertyInfo.FindMatch(msg, index, specifier, what, property) >= 0)
     369        return this;
     370
     371    return BHandler::ResolveSpecifier(msg, index, specifier, what, property);
     372}
     373
     374
    307375void
    308376TWindow::MessageReceived(BMessage* m)
    309377{
    310378    bool active = fFatBits->Active();
    311379
    312380    switch (m->what) {
     381        case B_EXECUTE_PROPERTY:
     382        case B_GET_PROPERTY:
     383        case B_SET_PROPERTY:
     384        {
     385            int32 index;
     386            BMessage specifier;
     387            int32 what;
     388            const char* property;
     389            if (m->GetCurrentSpecifier(&index, &specifier, &what, &property)
     390                != B_OK)
     391                return BWindow::MessageReceived(m);
     392
     393            status_t result = B_OK;
     394            BMessage reply(B_REPLY);
     395
     396            BPropertyInfo propertyInfo(sProperties);
     397            switch (propertyInfo.FindMatch(m, index, &specifier, what,
     398                        property)) {
     399                case 0:
     400                    fInfoBarState = true;
     401                    ShowInfo(true);
     402                    break;
     403
     404                case 1:
     405                    fInfoBarState = false;
     406                    ShowInfo(false);
     407                    break;
     408
     409                case 2:
     410                    SetGrid(true);
     411                    break;
     412
     413                case 3:
     414                    SetGrid(false);
     415                    break;
     416
     417                case 4:
     418                    if (fHPixelCount != fVPixelCount) {
     419                        int32 big = fHPixelCount > fVPixelCount ? fHPixelCount
     420                                        : fVPixelCount;
     421                        ResizeWindow(big, big);
     422                    }
     423                    break;
     424
     425                case 5:
     426                    if (m->what == B_GET_PROPERTY)
     427                        result = reply.AddInt32("result", fPixelSize);
     428                    else if (m->what == B_SET_PROPERTY) {
     429                        int32 zoom;
     430                        result = m->FindInt32("data", &zoom);
     431                        if (result == B_OK)
     432                            SetPixelSize(zoom);
     433                    }
     434                    break;
     435
     436                case 6:
     437                    fFatBits->MakeSticked(true);
     438                    break;
     439
     440                case 7:
     441                    fFatBits->MakeSticked(false);
     442                    break;
     443
     444                case 8:
     445                    fFatBits->CopyImage();
     446                    break;
     447
     448                default:
     449                    return BWindow::MessageReceived(m);
     450            }
     451
     452            if (result != B_OK) {
     453                reply.what = B_MESSAGE_NOT_UNDERSTOOD;
     454                reply.AddString("message", strerror(result));
     455                reply.AddInt32("error", result);
     456            }
     457
     458            m->SendReply(&reply);
     459            break;
     460        }
     461
    313462        case msg_show_info:
    314463            if (active) {
    315464                fInfoBarState = !fInfoBarState;
    TWindow::PixelCount(int32* h, int32 *v)  
    783932void
    784933TWindow::SetPixelSize(int32 s)
    785934{
     935    if (s > 16)
     936        s = 16;
     937    else if (s < 1)
     938        s = 1;
     939
    786940    if (s == fPixelSize)
    787941        return;
    788942
    TWindow::SetPixelSize(int32 s)  
    791945    // tell info that size has changed
    792946    // tell mag that size has changed
    793947
    794     CalcViewablePixels();
    795     ResizeWindow(fHPixelCount, fVPixelCount);
    796 }
    797 
    798 
    799 void
    800 TWindow::SetPixelSize(bool d)
    801 {
    802     if (d) {        // grow
    803         fPixelSize++;
    804         if (fPixelSize > 16)
    805             fPixelSize = 16;
    806     } else {
    807         fPixelSize--;
    808         if (fPixelSize < 1)
    809             fPixelSize = 1;
    810     }
    811 
    812948    float w = Bounds().Width();
    813949    float h = Bounds().Height();
    814950    CalcViewablePixels();
    TWindow::SetPixelSize(bool d)  
    821957}
    822958
    823959
     960void
     961TWindow::SetPixelSize(bool d)
     962{
     963    SetPixelSize(fPixelSize + (d ? 1 : -1));
     964}
     965
     966
    824967int32
    825968TWindow::PixelSize()
    826969{
  • src/apps/magnify/Magnify.h

    diff --git a/src/apps/magnify/Magnify.h b/src/apps/magnify/Magnify.h
    index 35cfa83..9b9663b 100644
    a b class TWindow : public BWindow {  
    201201        virtual void    MessageReceived(BMessage* message);
    202202        virtual bool    QuitRequested();
    203203
     204        status_t        GetSupportedSuites(BMessage* msg);
     205        BHandler*       ResolveSpecifier(BMessage* msg, int32 index,
     206                            BMessage* specifier, int32 what,
     207                            const char* property);
     208
    204209        void            GetPrefs(int32 pixelCount = -1);
    205210        void            SetPrefs();
    206211